Editor topic
Every ChatGPT query, every generated image, and every AI-assisted essay runs on data centres that consume real electricity. The International Energy Agency (IEA) estimates global data-centre demand reached 415 TWh in 2024 (1.5% of world electricity) and could exceed 945 TWh by 2030 as AI adoption accelerates.
Australia’s grid is greening — renewables reached 39% of generation in 2025 — even as data-centre load on the National Electricity Market is forecast to triple to 12 TWh by FY30. The five charts below follow a deliberate arc: global AI energy demand, then Australia’s electricity transition, rising generation, data-centre load on the grid, and where that load concentrates.
Multivariate: electricity consumption (TWh), share of global electricity (%), and regional additions. Source: International Energy Agency. (2025). Energy and AI.
Multivariate: fuel-source shares (% of generation) composition, not total volume. Source: Ritchie, H., Roser, M., & Rosado, P. (2025). Energy dataset. Our World in Data.
Multivariate: absolute generation (TWh) paired with renewables share (%) or per-capita use (kWh) scale and headroom, not fuel mix. Source: Ritchie, H., Roser, M., & Rosado, P. (2025). Energy dataset. Our World in Data.
Multivariate: data-centre consumption (TWh), NEM grid share (%), and FY30 scenarios. Source: Oxford Economics Australia. (2025). Data centre energy demand (Prepared for AEMO).
Multivariate: regional consumption (TWh) for FY25 and FY50. Source: Oxford Economics Australia. (2025). Data centre energy demand (Prepared for AEMO).
The human stakes
AI can democratise access to knowledge, accelerate research, and support students who use generative tools to learn — provided the energy system keeps pace. Australia has a genuine advantage: a rapidly greening grid and a stable regulatory environment that attracts hyperscale investment.
The efficiency gains that offset earlier waves of digitalisation may not hold. The IEA warns that in a Lift-Off scenario, global data-centre demand could exceed 1,700 TWh by 2035. Benefits could concentrate in Sydney and Melbourne while grid, water, and land costs are borne more broadly.
The invisible cost of intelligence is becoming visible. These five charts are a pitch for a story Australia needs to tell — before the servers outgrow the conversation.
Data visualisations created in R (plotly, flexdashboard). Datasets: Our World in Data Energy Dataset; International Energy Agency (2025) Energy and AI; Oxford Economics Australia (2025) report prepared for AEMO. Manually extracted IEA and AEMO figures documented in project CSV files and referenced in chart captions.
International Energy Agency. (2025). Energy and AI: Energy demand from AI. https://www.iea.org/reports/energy-and-ai/energy-demand-from-ai
Oxford Economics Australia. (2025). Data centre energy demand: Final report (Prepared for the Australian Energy Market Operator). https://www.aemo.com.au/-/media/files/stakeholder_consultation/consultations/nem-consultations/2024/2025-iasr-scenarios/final-docs/oxford-economics-australia-data-centre-energy-consumption-report.pdf
Ritchie, H., Roser, M., & Rosado, P. (2025). Energy dataset. Our World in Data. https://github.com/owid/energy-data
Rosado, P. (2020). Energy mix. Our World in Data. https://ourworldindata.org/energy-mix
---
title: "Powering Intelligence: How AI Is Rewiring Australia's Energy Future"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
theme: flatly
css: www/styles.css
social: menu
source_code: embed
self_contained: true
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(
echo = FALSE,
message = FALSE,
warning = FALSE
)
library(tidyverse)
library(plotly)
library(scales)
library(htmltools)
library(jsonlite)
source("data/load_data.R")
iea_global <- prep_iea_global()
aus_elec <- load_australia_electricity()
aus_mix <- prep_aus_elec_mix()
aemo_fy30 <- prep_aemo_scenarios_fy30()
aemo_hist <- prep_aemo_history_forecast()
aemo_regional <- prep_aemo_regional_long()
iea_regional <- load_iea_regional()
tc <- tc_colors
apa_source <- function(citation) {
paste0('<span class="source">Source: ', citation, ".</span>")
}
```
Introduction {data-icon="fa-bolt"}
=======================================================================
<div class="intro-hero">
<p class="intro-kicker">Editor topic</p>
<h2 class="intro-headline">AI and humanity: studying in the age of generative AI</h2>
<p class="intro-deck">
Every ChatGPT query, every generated image, and every AI-assisted essay runs on data centres that consume real electricity. The International Energy Agency (IEA) estimates global data-centre demand reached <strong>415 TWh in 2024</strong> (1.5% of world electricity) and could exceed <strong>945 TWh by 2030</strong> as AI adoption accelerates.
</p>
<p class="intro-deck">
Australia's grid is greening <e2><80><94> renewables reached <strong>39%</strong> of generation in 2025 <e2><80><94> even as data-centre load on the National Electricity Market is forecast to <strong>triple to 12 TWh by FY30</strong>. The five charts below follow a deliberate arc: global AI energy demand, then Australia's electricity transition, rising generation, data-centre load on the grid, and where that load concentrates.
</p>
<div class="intro-stats">
<div class="stat-card"><span class="stat-value">415 TWh</span><span class="stat-label">Global data-centre use, 2024</span></div>
<div class="stat-card"><span class="stat-value">945 TWh</span><span class="stat-label">IEA forecast, 2030</span></div>
<div class="stat-card"><span class="stat-value">39%</span><span class="stat-label">Australian renewables, 2025</span></div>
<div class="stat-card"><span class="stat-value">12 TWh</span><span class="stat-label">Australia data-centre load, FY30</span></div>
</div>
<div class="intro-explore"><strong>How to explore:</strong> Use the button controls above each chart. Hover for exact values. Click legend items to show or hide series.</div>
</div>
Chart 1 {data-icon="fa-globe"}
=======================================================================
<div class="story-lead"><strong>1 <e2><80><94> Global context.</strong> Use the <strong>buttons top-right</strong> to switch between the worldwide outlook and regional growth to 2030.</div>
<div class="interaction-hint">Interactive: click <strong>Global outlook</strong> or <strong>Regional growth</strong> above the chart.</div>
```{r chart1}
iea_base <- iea_global |> filter(scenario == "Base Case")
iea_sens <- iea_global |> filter(year == 2035)
regional <- iea_regional |>
mutate(
region = reorder(region, increment_twh),
label = paste0("+", increment_twh, " TWh (+", pct_increase_vs_2024, "%)")
)
p1 <- plot_ly() |>
add_trace(
data = iea_base, x = ~year, y = ~consumption_twh,
type = "scatter", mode = "lines+markers", name = "Consumption (TWh)",
line = list(color = tc$blue, width = 3), marker = list(size = 9),
hovertemplate = "<b>%{text}</b><br>Consumption: %{y} TWh<extra></extra>",
text = ~paste0(scenario, " (", year, ")"), visible = TRUE
) |>
add_trace(
data = iea_sens, x = ~year, y = ~consumption_twh,
type = "scatter", mode = "markers", name = "2035 sensitivity (TWh)",
marker = list(size = 12, symbol = "diamond", color = ~scenario,
colors = c("Lift-Off" = tc$coral, "High Efficiency" = tc$teal, "Headwinds" = tc$grey)),
hovertemplate = "<b>%{text}</b><br>Consumption: %{y} TWh<extra></extra>",
text = ~scenario, visible = TRUE
) |>
add_trace(
data = iea_base, x = ~year, y = ~share_global_elec_pct,
type = "scatter", mode = "lines+markers", name = "Share of global elec. (%)",
yaxis = "y2", line = list(color = tc$coral, dash = "dot", width = 2),
marker = list(size = 7, color = tc$coral),
hovertemplate = "Share: %{y}%<extra></extra>", visible = TRUE
) |>
add_trace(
data = regional, x = ~region, y = ~increment_twh,
type = "bar", name = "Regional growth (TWh)",
marker = list(color = tc$light_blue),
text = ~label, textposition = "outside",
hovertemplate = "<b>%{x}</b><br>Additional demand to 2030: %{y} TWh<extra></extra>",
visible = FALSE, xaxis = "x2", yaxis = "y3"
) |>
tc_layout(
"Chart 1: Global data-centre electricity demand is accelerating",
xaxis = list(title = "", tickvals = c(2024, 2030, 2035), domain = c(0, 1)),
yaxis = list(title = yaxis_title("Consumption (TWh)", tc$blue)),
yaxis2 = list(
title = yaxis2_title("Share (%)", tc$coral),
overlaying = "y", side = "right", range = c(0, 5),
tickfont = list(color = axis_label_col(tc$coral)), automargin = TRUE
),
xaxis2 = list(title = "", domain = c(0, 1), anchor = "y3", visible = FALSE),
yaxis3 = list(title = "Additional TWh to 2030", domain = c(0, 1), anchor = "x2", visible = FALSE),
legend = legend_inset(),
margin = MARGIN_BTNS,
updatemenus = list(
view_buttons(
active = 0,
buttons = list(
list(label = "Global outlook", method = "update",
args = list(list(visible = c(TRUE, TRUE, TRUE, FALSE)),
list(xaxis = list(visible = TRUE, title = ""),
xaxis2 = list(visible = TRUE), yaxis3 = list(visible = FALSE)))),
list(label = "Regional growth", method = "update",
args = list(list(visible = c(FALSE, FALSE, FALSE, TRUE)),
list(xaxis = list(visible = FALSE),
xaxis2 = list(visible = TRUE, title = ""), yaxis3 = list(visible = TRUE))))
)
)
)
)
chart_div(
p1,
paste0("<strong>Multivariate:</strong> electricity consumption (TWh), share of global electricity (%), and regional additions. ",
apa_source("International Energy Agency. (2025). <em>Energy and AI</em>")),
chart_num = 1,
aria_label = "Chart 1. Global data centre electricity demand with scenario sensitivity cases."
)
```
Chart 2 {data-icon="fa-leaf"}
=======================================================================
<div class="story-lead"><strong>2 <e2><80><94> Fuel composition (not volume).</strong> This chart shows <em>which</em> fuels supply Australia's electricity (% shares by coal, gas, wind, solar) <e2><80><94> the structural shift before we ask how much total power the grid produces.</div>
<div class="interaction-hint">Interactive: click <strong>2000-2010</strong>, <strong>2010-2020</strong>, or <strong>All years</strong> above the chart.</div>
```{r chart2}
mix_colors <- c("Coal" = tc$coal, "Gas" = tc$gas, "Wind" = tc$wind, "Solar" = tc$solar)
p2 <- plot_ly(
data = aus_mix, x = ~year, y = ~share_pct, color = ~source, colors = mix_colors,
type = "scatter", mode = "lines", stackgroup = "one", line = list(width = 1.2),
hovertemplate = "<b>%{fullData.name}</b><br>Year: %{x}<br>Share: %{y:.1f}%<extra></extra>"
) |>
tc_layout(
"Chart 2: Australia's electricity mix is shifting from coal to renewables",
xaxis = list(
title = "Year", dtick = 5,
rangeselector = list(
y = 1.02, yanchor = "bottom",
buttons = list(
list(count = 10, label = "2000-2010", step = "year", stepmode = "backward"),
list(count = 20, label = "2010-2020", step = "year", stepmode = "backward"),
list(step = "all", label = "All years")
)
),
rangeslider = list(visible = FALSE)
),
yaxis = list(title = "Share of generation (%)", range = c(0, 100)),
legend = legend_inset(),
margin = MARGIN_CHART2
)
chart_div(
p2,
paste0("<strong>Multivariate:</strong> fuel-source shares (% of generation) <e2><80><94> composition, not total volume. ",
apa_source("Ritchie, H., Roser, M., & Rosado, P. (2025). <em>Energy dataset</em>. Our World in Data")),
chart_num = 2,
aria_label = "Chart 2. Stacked area of Australian electricity generation shares by fuel."
)
```
Chart 3 {data-icon="fa-chart-line"}
=======================================================================
<div class="story-lead"><strong>3 <e2><80><94> Scale and headroom.</strong> Unlike Chart 2's fuel shares, this chart measures <em>how much</em> electricity Australia generates (TWh) and whether renewables are keeping pace <e2><80><94> or whether per-capita use is still rising as AI load arrives.</div>
<div class="interaction-hint">Interactive: click <strong>Renewables %</strong> or <strong>Per capita</strong> top-right above the chart.</div>
```{r chart3}
aus_dual <- aus_elec |> filter(year >= 2000)
p3 <- plot_ly(data = aus_dual) |>
add_trace(
x = ~year, y = ~electricity_generation, name = "Generation (TWh)",
type = "scatter", mode = "lines+markers",
line = list(color = tc$blue, width = 2.5), marker = list(size = 5),
hovertemplate = "Generation: %{y:.1f} TWh<extra></extra>"
) |>
add_trace(
x = ~year, y = ~renewables_share_elec, name = "Renewables share (%)",
type = "scatter", mode = "lines+markers", yaxis = "y2",
line = list(color = tc$teal, dash = "dot", width = 2.5),
marker = list(size = 5, symbol = "diamond"),
hovertemplate = "Renewables: %{y:.1f}%<extra></extra>", visible = TRUE
) |>
add_trace(
x = ~year, y = ~per_capita_electricity, name = "Per-capita use (kWh)",
type = "scatter", mode = "lines+markers", yaxis = "y2",
line = list(color = tc$orange, width = 2), marker = list(size = 4),
hovertemplate = "Per capita: %{y:,.0f} kWh<extra></extra>", visible = FALSE
) |>
tc_layout(
"Chart 3: Generation is rising as renewables take a larger share",
xaxis = list(title = "Year", dtick = 5),
yaxis = list(title = yaxis_title("Generation (TWh)", tc$blue), automargin = TRUE),
yaxis2 = list(
title = yaxis2_title("Renewables (%)", tc$teal),
overlaying = "y", side = "right", range = c(0, 110),
tickfont = list(color = axis_label_col(tc$teal)), automargin = TRUE
),
legend = legend_inset(),
margin = MARGIN_BTNS,
updatemenus = list(
view_buttons(
active = 0,
buttons = list(
list(label = "Renewables %", method = "update",
args = list(list(visible = c(TRUE, TRUE, FALSE)),
list(yaxis2 = list(
title = yaxis2_title("Renewables (%)", tc$teal),
range = c(0, 110), overlaying = "y", side = "right",
tickfont = list(color = axis_label_col(tc$teal)), automargin = TRUE
)))),
list(label = "Per capita", method = "update",
args = list(list(visible = c(TRUE, FALSE, TRUE)),
list(yaxis2 = list(
title = yaxis2_title("Per capita (kWh)", tc$orange),
range = c(9000, 11000), overlaying = "y", side = "right",
tickfont = list(color = axis_label_col(tc$orange)), automargin = TRUE
))))
)
)
)
)
chart_div(
p3,
paste0("<strong>Multivariate:</strong> absolute generation (TWh) paired with renewables share (%) or per-capita use (kWh) <e2><80><94> scale and headroom, not fuel mix. ",
apa_source("Ritchie, H., Roser, M., & Rosado, P. (2025). <em>Energy dataset</em>. Our World in Data")),
chart_num = 3,
aria_label = "Chart 3. Dual axis chart of Australian electricity generation and renewables or per capita use."
)
```
Chart 4 {data-icon="fa-server"}
=======================================================================
<div class="story-lead"><strong>4 <e2><80><94> AI on the grid.</strong> Data-centre demand could reach <strong>12 TWh by FY30</strong> under AEMO's Step Change scenario <e2><80><94> toggle to compare FY30 sensitivity cases.</div>
<div class="interaction-hint">Interactive: click <strong>Timeline</strong> or <strong>FY30 scenarios</strong> top-right above the chart.</div>
```{r chart4}
scenario_cols <- c(
"Progressive Change" = tc$grey, "Step Change" = tc$blue,
"Green Energy Industries" = tc$teal, "Rapid AI Uptake" = tc$coral
)
p4 <- plot_ly() |>
add_trace(
data = aemo_hist, x = ~financial_year, y = ~consumption_twh,
type = "scatter", mode = "lines+markers", name = "Consumption (TWh)",
line = list(color = tc$blue, width = 3),
marker = list(size = ~if_else(period == "Historical", 9, 11),
symbol = ~if_else(period == "Historical", "circle", "diamond"),
color = ~if_else(period == "Historical", tc$blue, tc$coral)),
hovertemplate = "<b>%{x}</b><br>Consumption: %{y} TWh<extra></extra>", visible = TRUE
) |>
add_trace(
data = aemo_hist, x = ~financial_year, y = ~nem_grid_share_pct,
type = "scatter", mode = "lines+markers", name = "NEM grid share (%)",
yaxis = "y2", line = list(color = tc$coral, dash = "dot", width = 2),
marker = list(size = 7, color = tc$coral),
hovertemplate = "NEM share: %{y}%<extra></extra>", visible = TRUE
) |>
add_trace(
data = aemo_fy30, x = ~scenario, y = ~consumption_twh,
type = "bar", name = "FY30 scenarios (TWh)",
marker = list(color = ~scenario, colors = scenario_cols),
text = ~paste0(consumption_twh, " TWh"), textposition = "outside",
hovertemplate = "<b>%{x}</b><br>FY30: %{y} TWh<extra></extra>",
visible = FALSE, xaxis = "x2", yaxis = "y3"
) |>
tc_layout(
"Chart 4: Australian data-centre demand - history and scenarios",
xaxis = list(title = "", categoryorder = "array",
categoryarray = aemo_hist$financial_year, domain = c(0, 1)),
yaxis = list(title = yaxis_title("Consumption (TWh)", tc$blue)),
yaxis2 = list(
title = yaxis2_title("NEM share (%)", tc$coral),
overlaying = "y", side = "right", range = c(0, 14),
tickfont = list(color = axis_label_col(tc$coral)), automargin = TRUE
),
xaxis2 = list(title = "", domain = c(0, 1), anchor = "y3", visible = FALSE),
yaxis3 = list(title = "FY30 consumption (TWh)", domain = c(0, 1),
anchor = "x2", visible = FALSE, range = c(0, 18)),
legend = legend_inset(),
margin = MARGIN_BTNS,
updatemenus = list(
view_buttons(
active = 0,
buttons = list(
list(label = "Timeline", method = "update",
args = list(list(visible = c(TRUE, TRUE, FALSE)),
list(xaxis = list(visible = TRUE), xaxis2 = list(visible = FALSE),
yaxis3 = list(visible = FALSE)))),
list(label = "FY30 scenarios", method = "update",
args = list(list(visible = c(FALSE, FALSE, TRUE)),
list(xaxis = list(visible = FALSE), xaxis2 = list(visible = TRUE),
yaxis3 = list(visible = TRUE))))
)
)
)
)
chart_div(
p4,
paste0("<strong>Multivariate:</strong> data-centre consumption (TWh), NEM grid share (%), and FY30 scenarios. ",
apa_source("Oxford Economics Australia. (2025). <em>Data centre energy demand</em> (Prepared for AEMO)")),
chart_num = 4,
aria_label = "Chart 4. Australian data centre electricity consumption timeline and FY30 scenarios."
)
```
Chart 5 {data-icon="fa-city"}
=======================================================================
<div class="story-lead"><strong>5 <e2><80><94> Local geography.</strong> Demand is concentrating in <strong>Sydney</strong> and <strong>Melbourne</strong> <e2><80><94> filter by region to see who bears the load.</div>
<div class="interaction-hint">Interactive: click <strong>All</strong>, <strong>Sydney</strong>, <strong>Melbourne</strong>, or <strong>Other</strong> top-right above the chart.</div>
```{r chart5}
regional_cols <- c("Sydney" = tc$blue, "Melbourne" = tc$coral, "Other regions" = tc$grey)
p5 <- plot_ly(
data = aemo_regional, x = ~financial_year, y = ~consumption_twh,
color = ~region, colors = regional_cols, type = "bar",
text = ~paste0(consumption_twh, " TWh"), textposition = "inside",
insidetextfont = list(color = "white", size = 10),
hovertemplate = "<b>%{fullData.name}</b><br>%{x}: %{y:.1f} TWh<extra></extra>"
) |>
tc_layout(
"Chart 5: Data-centre demand is concentrating in Sydney and Melbourne",
barmode = "stack",
xaxis = list(title = "Financial year"),
yaxis = list(title = "Electricity consumption (TWh)", range = c(0, 40)),
legend = legend_inset(),
margin = MARGIN_BTNS,
annotations = list(
list(x = "FY25", y = 1.0, yref = "paper", text = "Melbourne: 20%",
showarrow = FALSE, font = list(size = 9, color = tc$coral), xanchor = "center"),
list(x = "FY50", y = 1.0, yref = "paper", text = "Melbourne: 41%",
showarrow = FALSE, font = list(size = 9, color = tc$coral), xanchor = "center")
),
updatemenus = list(
view_buttons(
active = 0,
buttons = list(
list(label = "All", method = "restyle", args = list(list(visible = c(TRUE, TRUE, TRUE)))),
list(label = "Sydney", method = "restyle", args = list(list(visible = c(TRUE, FALSE, FALSE)))),
list(label = "Melbourne", method = "restyle", args = list(list(visible = c(FALSE, TRUE, FALSE)))),
list(label = "Other", method = "restyle", args = list(list(visible = c(FALSE, FALSE, TRUE))))
)
)
)
)
chart_div(
p5,
paste0("<strong>Multivariate:</strong> regional consumption (TWh) for FY25 and FY50. ",
apa_source("Oxford Economics Australia. (2025). <em>Data centre energy demand</em> (Prepared for AEMO)")),
chart_num = 5,
aria_label = "Chart 5. Stacked bar chart of Australian data centre consumption by region."
)
```
Closing {data-icon="fa-flag-checkered"}
=======================================================================
<div class="closing-hero">
<p class="closing-kicker">The human stakes</p>
<h2 class="closing-headline">What AI's energy cost means for Australia</h2>
<div class="closing-grid">
<div class="closing-card closing-gain"><h3>What may be gained</h3><p>AI can democratise access to knowledge, accelerate research, and support students who use generative tools to learn <e2><80><94> provided the energy system keeps pace. Australia has a genuine advantage: a rapidly greening grid and a stable regulatory environment that attracts hyperscale investment.</p></div>
<div class="closing-card closing-loss"><h3>What may be lost</h3><p>The efficiency gains that offset earlier waves of digitalisation may not hold. The IEA warns that in a Lift-Off scenario, global data-centre demand could exceed <strong>1,700 TWh by 2035</strong>. Benefits could concentrate in Sydney and Melbourne while grid, water, and land costs are borne more broadly.</p></div>
<div class="closing-card closing-act"><h3>How to prepare and act</h3><ul class="closing-list"><li><strong>Ask where your data lives.</strong> Using an AI tool is also an energy choice.</li><li><strong>Demand transparency.</strong> Universities and tech firms should publish energy use data.</li><li><strong>Plan the grid now.</strong> AEMO forecasts data centres at <strong>12% of NEM supply by FY50</strong>.</li></ul></div>
</div>
<p class="closing-final">
The invisible cost of intelligence is becoming visible. These five charts are a pitch for a story Australia needs to tell <e2><80><94> before the servers outgrow the conversation.
</p>
</div>
<div class="closing-section acknowledgements">
<h2 class="section-heading">Acknowledgements</h2>
<p>Data visualisations created in R (plotly, flexdashboard). Datasets: Our World in Data Energy Dataset; International Energy Agency (2025) <em>Energy and AI</em>; Oxford Economics Australia (2025) report prepared for AEMO. Manually extracted IEA and AEMO figures documented in project CSV files and referenced in chart captions.</p>
</div>
<div class="closing-section references">
<h2 class="section-heading">References</h2>
<p>International Energy Agency. (2025). <em>Energy and AI: Energy demand from AI</em>. https://www.iea.org/reports/energy-and-ai/energy-demand-from-ai</p>
<p>Oxford Economics Australia. (2025). <em>Data centre energy demand: Final report</em> (Prepared for the Australian Energy Market Operator). https://www.aemo.com.au/-/media/files/stakeholder_consultation/consultations/nem-consultations/2024/2025-iasr-scenarios/final-docs/oxford-economics-australia-data-centre-energy-consumption-report.pdf</p>
<p>Ritchie, H., Roser, M., & Rosado, P. (2025). <em>Energy dataset</em>. Our World in Data. https://github.com/owid/energy-data</p>
<p>Rosado, P. (2020). <em>Energy mix</em>. Our World in Data. https://ourworldindata.org/energy-mix</p>
</div>