Case Study 2: Scientific Error Bars and the IPCC Consensus Charts

The Intergovernmental Panel on Climate Change produces reports that shape global climate policy. The figures in those reports are among the most-studied examples of how to visualize scientific uncertainty. Every error bar, every confidence band, every "likely" and "very likely" shading choice is the product of decades of deliberation about how to communicate what we know and do not know. This case study walks through the patterns.


The Situation

The Intergovernmental Panel on Climate Change (IPCC) releases a major report every 6-8 years summarizing the state of climate science. The most recent full assessment (AR6, released 2021-2023) includes hundreds of figures, most of which use matplotlib or similar tools to visualize climate model projections, observational records, and the relationships between them. Every figure goes through intense review — not just for the data, but for how the data is visualized.

The central visualization challenge for the IPCC is uncertainty. Climate models produce projections with confidence intervals. Observational records have measurement error. Historical reconstructions have reconstruction uncertainty. Every piece of scientific information in the IPCC reports comes with associated uncertainty, and the figures must communicate both the central estimate and the uncertainty in a form that policymakers and the public can read.

This creates a specific communication problem. On one hand, the IPCC needs to state findings clearly — "global temperature will rise by X degrees under scenario Y" — because vague findings cannot inform policy. On the other hand, every finding has real uncertainty, and hiding that uncertainty would be scientifically dishonest. The figures have to walk a line between claims that are strong enough to be useful and claims that are honest about what is uncertain.

The IPCC's solution is a specific set of visualization conventions: confidence bands around central estimates, shaded regions with labeled probability levels ("likely," "very likely"), error bars with asymmetric bounds, and explicit language in captions distinguishing between observational uncertainty and model uncertainty. These conventions are not unique to the IPCC — they come from a broader tradition in scientific visualization — but the IPCC's consistent application of them across hundreds of figures in every report has made them a canonical reference for how to visualize scientific uncertainty.

This case study examines the patterns and shows how to implement them in matplotlib using the tools from this chapter.

The Data

For this case study, imagine projecting a climate variable (global mean temperature) to 2100 under multiple scenarios. The data includes:

  • Historical record (1850-2024): a single time series with measurement uncertainty.
  • Model projections (2025-2100): multiple climate model runs, each producing a projection under a specific scenario (RCP 2.6, RCP 4.5, RCP 8.5 for low, medium, and high emissions).
  • Ensemble statistics: for each scenario, the mean and quantile ranges (5%, 17%, 83%, 95%) across the model runs.
import pandas as pd
import numpy as np

# Synthetic data for the case study
years_hist = np.arange(1850, 2025)
temp_hist = 0.1 * (years_hist - 1850) * 0.01 + np.random.randn(len(years_hist)) * 0.1
hist_uncertainty = np.ones_like(years_hist) * 0.1

years_proj = np.arange(2025, 2101)

# Three scenarios: low, medium, high
scenarios = {
    "RCP 2.6 (low)": {"mean": 2 + (years_proj - 2025) * 0.005, "low": 1.8, "high": 2.3},
    "RCP 4.5 (medium)": {"mean": 2 + (years_proj - 2025) * 0.015, "low": 1.8, "high": 2.8},
    "RCP 8.5 (high)": {"mean": 2 + (years_proj - 2025) * 0.035, "low": 2.0, "high": 4.5},
}

This is deliberately simplified. Real IPCC data is more complex, includes many more scenarios, and has longer historical records. The structure is correct: a historical period plus multiple future scenarios with uncertainty ranges.

The Visualization

The canonical IPCC-style projection chart looks like this:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(14, 7), constrained_layout=True)

# Historical record (thick line with shaded uncertainty)
ax.plot(years_hist, temp_hist, color="black", linewidth=1.5, label="Historical")
ax.fill_between(
    years_hist,
    temp_hist - hist_uncertainty,
    temp_hist + hist_uncertainty,
    color="gray",
    alpha=0.3,
)

# Future projections with confidence bands
colors = {
    "RCP 2.6 (low)": "#1f77b4",      # blue
    "RCP 4.5 (medium)": "#ff7f0e",   # orange
    "RCP 8.5 (high)": "#d62728",     # red
}

for scenario, data in scenarios.items():
    mean = data["mean"]
    # Compute the 5-95% range (simplified)
    low_bound = mean * (data["low"] / 2.0)
    high_bound = mean * (data["high"] / 2.0)

    color = colors[scenario]
    ax.plot(years_proj, mean, color=color, linewidth=2, label=scenario)
    ax.fill_between(years_proj, low_bound, high_bound, color=color, alpha=0.2)

# Connect historical to future
transition_year = 2024
ax.axvline(transition_year, color="gray", linestyle="--", linewidth=0.8, alpha=0.7)
ax.text(
    transition_year - 2, ax.get_ylim()[1] * 0.95,
    "Historical | Projections",
    fontsize=9, color="gray",
    ha="right",
)

# Labels and title
ax.set_title(
    "Global Mean Temperature: Historical and Projected, 1850-2100",
    fontsize=14, loc="left", fontweight="semibold", pad=12,
)
ax.set_xlabel("Year")
ax.set_ylabel("Temperature Anomaly (°C)")

# Legend
ax.legend(loc="upper left", frameon=False)

# Declutter
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)

# Source attribution
fig.text(
    0.125, 0.02,
    "Source: Synthetic data for illustration. Real figures would use IPCC AR6 data.",
    fontsize=8, color="gray", style="italic",
)

fig.savefig("ipcc_style.png", dpi=300, bbox_inches="tight")

The key elements:

1. A central line for each estimate. Both the historical record and each scenario have a clearly-drawn central line that shows the best estimate.

2. Confidence bands around each central line. The fill_between calls create shaded regions around each central line showing the uncertainty range. Historical uncertainty is shown in gray; each scenario's uncertainty is shown in the scenario's color at lower alpha.

3. Distinct colors for each scenario. Blue for low emissions, orange for medium, red for high. The colors are chosen to match the qualitative severity of the scenarios.

4. A transition marker between historical and projection. The vertical dashed line at 2024 separates the observed past from the projected future. Readers can see at a glance where we stop knowing and start estimating.

5. A legend identifying the scenarios. The legend names each scenario explicitly. Without it, the colors would be decoded-by-guessing.

6. An action title. The title states what the chart is about, including both historical and projected time periods.

The Patterns

Several specific patterns used in IPCC-style charts are worth noting.

Confidence bands with graduated alpha. The IPCC often uses multiple nested bands with different alpha values — e.g., a "likely" range (17-83%) with higher alpha and a "very likely" range (5-95%) with lower alpha. This conveys two levels of confidence in a single visual:

# Very likely range (5-95%)
ax.fill_between(years, ci_5, ci_95, color=color, alpha=0.15, label="Very likely (5-95%)")
# Likely range (17-83%)
ax.fill_between(years, ci_17, ci_83, color=color, alpha=0.3, label="Likely (17-83%)")
# Central estimate
ax.plot(years, mean, color=color, linewidth=2, label="Mean")

The darker inner band is the "likely" range; the lighter outer band is the "very likely" range. The reader sees both ranges in a single chart.

Asymmetric uncertainty. Climate projections are often skewed — the upper tail is longer than the lower tail. Asymmetric error bars represent this correctly:

ax.errorbar(x, y, yerr=[lower_errors, upper_errors], fmt="o")

Symmetric error bars would misrepresent skewed data. The IPCC consistently uses asymmetric errors for skewed quantities.

Multi-scenario comparison with consistent colors. The IPCC uses a consistent color convention across figures: blue for low-emission scenarios, red for high-emission scenarios. Within a figure with multiple scenarios, the colors are chosen so that the scenarios can be visually distinguished and compared. This consistency across figures in a report is a form of the "systematic styling" principle from Chapter 12.

Historical records in neutral colors. Historical data is shown in black or gray, not in colors that could be mistaken for scenario projections. This visual convention prevents the reader from confusing "what happened" with "what is projected to happen."

Caption language matching visualization. IPCC captions explicitly use phrases like "likely range," "very likely range," "model ensemble mean," and "observational uncertainty." The visualization and the caption reinforce each other — the reader sees a shaded band and reads "likely range (17-83%)" and understands exactly what the band represents.

The Design Decisions

The IPCC's visualization patterns reflect several explicit design decisions that practitioners can learn from.

1. Uncertainty is a first-class element, not an afterthought. Every estimate is shown with its uncertainty range. The chart cannot show point estimates without bands, because that would imply false precision. The fill_between calls are non-negotiable parts of the figure, not optional decorations.

2. Colors are semantic. Blue for low emissions, orange for medium, red for high. Black or gray for historical. The colors match the conceptual severity of each scenario, so the visual intensity matches the data intensity.

3. The transition between known and projected is marked explicitly. A vertical line at the present year separates the observational record (what we know) from the model projections (what we estimate). This prevents readers from confusing past measurements with future projections.

4. Captions do work that charts alone cannot. IPCC figure captions are long and specific, describing what each color and shaded region represents, which model ensemble was used, and what confidence level each band represents. The reader who reads both the chart and the caption gets the full information.

5. Consistency across figures in a report. Different figures in the same IPCC report use the same colors for the same scenarios, the same shading conventions for the same confidence levels, and the same structural patterns. This allows the reader to build up familiarity across the report.

Complications and Criticisms

IPCC figures are widely respected but not universally praised. Several critiques are worth acknowledging.

Dense and complex. IPCC figures are information-dense, sometimes to the point of being unreadable for non-specialists. The trade-off is real: more information means more precision and more reader effort. For policy audiences, simpler summary figures are often produced alongside the dense originals.

Uncertainty can be misread. Readers sometimes interpret "likely" as "certain" or conflate "model uncertainty" with "observational uncertainty." The IPCC language is precise, but casual readers may not parse the distinctions. This is an ongoing communication challenge.

Scenarios can be misinterpreted. "RCP 8.5" is a specific emissions scenario, not a prediction. Some readers treat it as a forecast rather than a what-if. The IPCC has updated its language and visualization patterns over successive reports to try to address this, but the problem persists.

Visual complexity can obscure key messages. A figure with multiple scenarios, multiple confidence bands, multiple time periods, and multiple annotations can be so dense that the headline finding gets lost. Some critics argue for simpler figures with one clear message.

Colorblind accessibility. Some older IPCC figures used red/green combinations that are problematic for deuteranopia. Newer reports have updated to more colorblind-friendly palettes, but the transition has been gradual.

Lessons for Practice

Most practitioners will not produce IPCC figures, but the patterns transfer to any context where uncertainty matters.

1. Always show uncertainty. Whenever your data is a measurement or an estimate — which is almost always — show the uncertainty explicitly. ax.errorbar or ax.fill_between are the tools. Omitting uncertainty is a form of visualization dishonesty.

2. Use graduated alpha for multiple confidence levels. Nested fill_between calls with different alpha values let you show multiple confidence levels in a single chart. The reader sees both "likely" and "very likely" ranges without needing separate charts.

3. Mark the transition between data and projection. If your chart shows both historical and projected data, separate them visually — with a vertical line, a color change, or an annotation. Do not let the reader confuse what you measured with what you estimated.

4. Use colors semantically. If your data has a natural severity or ordering (low/medium/high, good/neutral/bad), use colors that match. Blue for cool, red for warm is semantically appropriate for temperature. Green for positive, red for negative is semantically appropriate for changes.

5. Write captions that match the visual. The caption and the chart should reinforce each other. If your chart uses a shaded band, the caption should explicitly name what the band represents.

6. Consistency within a document. If you are producing multiple charts for one report, use the same colors for the same categories across all figures. This builds reader familiarity and reduces cognitive load.

7. Test with non-specialist readers. IPCC figures are often criticized as hard to read. Test your own uncertainty visualizations with readers who are not specialists, and adjust if they misinterpret the patterns.


Discussion Questions

  1. On complexity vs. clarity. IPCC figures are dense and information-rich. Is this the right trade-off for a scientific report, or should they be simplified for broader accessibility?

  2. On scenario framing. RCP 8.5 is a specific emissions scenario, not a prediction. How should figures visually distinguish "scenarios" from "predictions" to prevent misreading?

  3. On alpha levels. Graduated alpha lets you show multiple confidence levels in one chart. At what point does this become too much information for a reader to parse?

  4. On uncertainty communication. The IPCC uses terms like "likely" and "very likely" with specific probability ranges (17-83% and 5-95%). Is this precision helpful, or does the casual reader miss the distinction?

  5. On your own practice. Think of a chart you made recently that shows estimates or measurements. Did you show uncertainty? If not, how would the chart change if you added confidence bands?

  6. On the role of captions. IPCC captions are long and specific. Modern data journalism tries to put context on the chart itself rather than in captions. Which approach is right for scientific reports vs. public communication?


The IPCC's visualization patterns are one of the most thoughtful answers to "how do we show what we know and do not know." Not every practitioner needs to produce IPCC-level figures, but every practitioner can learn from the patterns: show uncertainty always, use confidence bands, mark transitions between measurement and projection, pick semantic colors, and let the caption reinforce the chart. Apply these patterns to your own work and your charts will be more honest — and more effective — than most of what you see in the wild.