gap <- data.frame(
year = 2024:2035,
ssab_bf_gas = c(80,78,75,70,60,40, 0, 0, 0, 0, 0, 0),
biofuel_pellets = c( 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9),
electric_boilers = c( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
ssab_eaf = c( 0, 0, 0, 0, 0, 0,30,30,30,30,30,30),
lkab = c( 0, 0, 0, 0, 0, 0, 0, 5,15,25,28,30),
uniper = c( 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8,12),
own_production = c(10,12,15,17,20,28,22,22,22,20,19,18),
gap_unconfirmed = c( 0, 0, 0, 3,10,22,38,33,23,12, 5, 0)
)
gap_long <- gap |>
pivot_longer(-year, names_to = "source", values_to = "pct") |>
mutate(source = factor(source,
levels = c("ssab_bf_gas","biofuel_pellets","electric_boilers",
"ssab_eaf","lkab","uniper",
"own_production","gap_unconfirmed"),
labels = c("SSAB BF gas (phasing out)",
"Biofuel / pellets (~9%)",
"Electric boilers (~1%)",
"SSAB EAF waste heat (~30%)",
"LKAB sulfuric acid (~30%)",
"Uniper hydrogen heat",
"Own production (boilers)",
"Gap — unconfirmed supply")
))
p_gap <- ggplot(gap_long,
aes(x = factor(year), y = pct, fill = source,
text = paste0(source, " (", year, "): ", pct, "%"))) +
geom_bar(stat = "identity", width = 0.75) +
geom_vline(xintercept = 6.5, linetype = "dashed",
color = "#A32D2D", linewidth = 0.9) +
annotate("text", x = 6.6, y = 95,
label = "EAF online\n~2030",
hjust = 0, size = 3, color = "#A32D2D") +
scale_fill_manual(values = c(
"SSAB BF gas (phasing out)" = "#A32D2D",
"Biofuel / pellets (~9%)" = "#D4A520",
"Electric boilers (~1%)" = "#90CAF9",
"SSAB EAF waste heat (~30%)" = "#BA7517",
"LKAB sulfuric acid (~30%)" = "#1D9E75",
"Uniper hydrogen heat" = "#185FA5",
"Own production (boilers)" = "#888780",
"Gap — unconfirmed supply" = "#C8C8C4"
)) +
labs(x = "Year", y = "Share of total heat demand (%)", fill = NULL) +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom",
panel.grid.major.x = element_blank(),
axis.text.x = element_text(angle = 30, hjust = 1))
ggplotly(p_gap, tooltip = "text") |>
layout(legend = list(orientation = "h", y = -0.3))