Editor topic: AI and humanity — studying in the age of generative AI.
Every ChatGPT query, every generated image, 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. These five interactive charts connect the global AI energy surge to Australia’s local grid, scenarios, and geography.
How to explore: Use the button controls above each chart. Hover for exact values. Click legend items to show or hide series.
AI workloads run on GPU accelerators that draw far more power per rack than conventional servers. The IEA projects accelerated-server electricity use will grow 30% per year through 2030. Use the buttons above the chart to switch between the global outlook and regional growth.
Multivariate: electricity consumption (TWh), share of global electricity (%), and regional additions by country. Sensitivity cases show IEA uncertainty to 2035. Source: International Energy Agency, 2025.
Australia’s electricity mix has shifted from coal-dominated generation toward wind and solar. Use the time-range buttons (top-left of chart) to focus on different decades, or click legend items to isolate a fuel source.
Multivariate: composition of electricity generation by fuel source (coal, gas, wind, solar) over time. Stacked areas show changing shares summing to 100%. Source: Ritchie et al., 2025, Our World in Data Energy Dataset.
Total generation is rising even as renewables gain share. Use the buttons above the chart to compare renewables share or per-capita electricity use alongside total generation.
Multivariate: total electricity generation (TWh) compared with renewables share (%) or per-capita consumption (kWh). Dual-axis design shows decarbonisation alongside absolute demand growth. Source: Ritchie et al., 2025, Our World in Data Energy Dataset.
Australian data centres consumed 3.9 TWh in FY25 (2.2% of NEM grid supply). Under AEMO’s Step Change scenario, demand could reach 12 TWh by FY30 and 34.5 TWh by FY50. Switch views to compare the historical timeline with FY30 scenario outcomes.
Multivariate: data-centre consumption (TWh) and NEM grid share (%) over time, plus FY30 scenario comparison (Progressive Change to Rapid AI Uptake). Source: Oxford Economics Australia, 2025, prepared for AEMO.
Digital infrastructure concentrates in Sydney and Melbourne. Melbourne’s share of national data-centre electricity is forecast to rise from 20% to 41%. Use the region buttons above the chart to filter the view.
Multivariate: regional consumption (TWh) by city/region for FY25 and FY50, with Melbourne's rising national share annotated. Hyperscale projects drive Melbourne's growth. Source: Oxford Economics Australia, 2025, prepared for AEMO.
What may be gained: AI can support learning and productivity if the energy system keeps pace. Australia’s greening grid is a genuine advantage.
What may be lost: Without grid planning, AI benefits may concentrate in Sydney and Melbourne. The IEA Lift-Off scenario exceeds 1,700 TWh globally by 2035.
Prepare and act: Ask where your data lives. Demand transparency from universities and tech firms. Plan grid infrastructure now — AEMO forecasts data centres at 12% of NEM supply by FY50.
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.
No generative AI tools were used to create the data visualisations, narrative text, or analysis for this assignment. If GenAI was used for any component, acknowledge it here following RMIT Library guidelines.
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
---
```{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
source_note <- function(...) {
paste0('<span class="source">Source: ', paste(..., collapse = "; "), ".</span>")
}
```
Introduction {data-icon="fa-bolt"}
=======================================================================
<div class="story-lead">
**Editor topic:** AI and humanity <e2><80><94> studying in the age of generative AI.
Every ChatGPT query, every generated image, 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 <e2><80><94> renewables reached **39%** of generation in 2025 <e2><80><94> even as data-centre load on the National Electricity Market is forecast to **triple to 12 TWh by FY30**. These five interactive charts connect the global AI energy surge to Australia's local grid, scenarios, and geography.
**How to explore:** Use the **button controls** above each chart. Hover for exact values. Click legend items to show or hide series.
</div>
Chart 1 {data-icon="fa-globe"}
=======================================================================
<div class="story-lead">
AI workloads run on **GPU accelerators** that draw far more power per rack than conventional servers. The IEA projects accelerated-server electricity use will grow **30% per year** through 2030. Use the **buttons above the chart** to switch between the global outlook and regional growth.
</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 = "Consumption (TWh)", titlefont = list(color = tc$blue)),
yaxis2 = list(
title = yaxis2_title("Share (%)", tc$coral),
overlaying = "y", side = "right", range = c(0, 5),
tickfont = list(color = 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 by country. Sensitivity cases show IEA uncertainty to 2035. ",
source_note("International Energy Agency, 2025")
),
chart_num = 1,
aria_label = "Chart 1. Global data centre electricity demand from 2024 to 2035 with scenario sensitivity cases and regional growth bars."
)
```
Chart 2 {data-icon="fa-leaf"}
=======================================================================
<div class="story-lead">
Australia's electricity mix has shifted from coal-dominated generation toward wind and solar. Use the **time-range buttons** (top-left of chart) to focus on different decades, or click legend items to isolate a fuel source.
</div>
<div class="interaction-hint">Interactive: click <strong>2000<e2><80><93>2010</strong>, <strong>2010<e2><80><93>2020</strong>, or <strong>All years</strong> to filter the timeline. Click legend labels to hide/show fuel types.</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> composition of electricity generation by fuel source ",
"(coal, gas, wind, solar) over time. Stacked areas show changing shares summing to 100%. ",
source_note("Ritchie et al., 2025, Our World in Data Energy Dataset")
),
chart_num = 2,
aria_label = "Chart 2. Stacked area chart of Australian electricity generation shares by fuel from 2000 to 2025."
)
```
Chart 3 {data-icon="fa-chart-line"}
=======================================================================
<div class="story-lead">
Total generation is rising even as renewables gain share. Use the **buttons above the chart** to compare renewables share or per-capita electricity use alongside total generation.
</div>
<div class="interaction-hint">Interactive: click <strong>Renewables %</strong> or <strong>Per capita</strong> 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 = "Generation (TWh)",
titlefont = list(color = tc$blue),
automargin = TRUE
),
yaxis2 = list(
title = yaxis2_title("Renewables (%)", tc$teal),
overlaying = "y", side = "right",
range = c(0, 110),
tickfont = list(color = 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 = 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 = tc$orange), automargin = TRUE
))
))
)
)
)
)
chart_div(
p3,
paste0(
"<strong>Multivariate:</strong> total electricity generation (TWh) compared with ",
"renewables share (%) or per-capita consumption (kWh). Dual-axis design shows ",
"decarbonisation alongside absolute demand growth. ",
source_note("Ritchie et al., 2025, Our World in Data Energy Dataset")
),
chart_num = 3,
aria_label = "Chart 3. Dual axis chart of Australian electricity generation and renewables share or per capita use from 2000 to 2025."
)
```
Chart 4 {data-icon="fa-server"}
=======================================================================
<div class="story-lead">
Australian data centres consumed **3.9 TWh in FY25** (2.2% of NEM grid supply). Under AEMO's Step Change scenario, demand could reach **12 TWh by FY30** and **34.5 TWh by FY50**. Switch views to compare the historical timeline with FY30 scenario outcomes.
</div>
<div class="interaction-hint">Interactive: click <strong>Timeline</strong> or <strong>FY30 scenarios</strong> 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 = "Consumption (TWh)", titlefont = list(color = tc$blue)),
yaxis2 = list(
title = yaxis2_title("NEM share (%)", tc$coral),
overlaying = "y", side = "right", range = c(0, 14),
tickfont = list(color = 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) and NEM grid share (%) ",
"over time, plus FY30 scenario comparison (Progressive Change to Rapid AI Uptake). ",
source_note("Oxford Economics Australia, 2025, prepared for AEMO")
),
chart_num = 4,
aria_label = "Chart 4. Australian data centre electricity consumption timeline and FY30 scenario comparison."
)
```
Chart 5 {data-icon="fa-city"}
=======================================================================
<div class="story-lead">
Digital infrastructure concentrates in **Sydney** and **Melbourne**. Melbourne's share of national data-centre electricity is forecast to rise from **20% to 41%**. Use the **region buttons** above the chart to filter the view.
</div>
<div class="interaction-hint">Interactive: click <strong>All</strong>, <strong>Sydney</strong>, <strong>Melbourne</strong>, or <strong>Other</strong> 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) by city/region for FY25 and FY50, ",
"with Melbourne's rising national share annotated. Hyperscale projects drive Melbourne's growth. ",
source_note("Oxford Economics Australia, 2025, prepared for AEMO")
),
chart_num = 5,
aria_label = "Chart 5. Stacked bar chart of Australian data centre electricity consumption by region for FY25 and FY50."
)
```
Closing {data-icon="fa-flag-checkered"}
=======================================================================
<div class="story-lead">
**What may be gained:** AI can support learning and productivity if the energy system keeps pace. Australia's greening grid is a genuine advantage.
**What may be lost:** Without grid planning, AI benefits may concentrate in Sydney and Melbourne. The IEA Lift-Off scenario exceeds **1,700 TWh globally by 2035**.
**Prepare and act:** Ask where your data lives. Demand transparency from universities and tech firms. Plan grid infrastructure now <e2><80><94> AEMO forecasts data centres at **12% of NEM supply by FY50**.
</div>
<div class="acknowledgements">
## Acknowledgements
<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.</p>
<p>No generative AI tools were used to create the data visualisations, narrative text, or analysis for this assignment. If GenAI was used for any component, acknowledge it here following RMIT Library guidelines.</p>
</div>
<div class="references">
## References
<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>