diff --git a/benchmarking/index.md b/benchmarking/index.md index 2feab14a..1c47047d 100644 --- a/benchmarking/index.md +++ b/benchmarking/index.md @@ -82,18 +82,8 @@ Many apparent disagreements come from the denominator, not from missing emission The goal is not an exact match to one external number. It is whether our estimate aligns with the **preponderance of the evidence**, after fair scope and dollar treatment. -## Results for this release - -:::{figure} ../figures/diagrams/benchmark-2026-rc.png -:label: fig-benchmark-2026-rc -:alt: Donut chart titled How Cornerstone compares to third-party references. About 70 percent of country-sector pairs with a verified external benchmark fall within 25 percent of the benchmark; 21 percent have a 25 to 50 percent gap; 10 percent have a gap of 50 percent or more. -Share of country–sector pairs with a verified external benchmark. About 70% fall within 25% of the benchmark; the rest have larger gaps. -::: - -See [](../releases/rc.md) for the release summary. - :::{seealso} Related -Internal accounting checks live on [](../validation/index.md). Version-specific headlines will also appear in the [](../releases/index.md). +Internal accounting checks live on [](../validation/index.md). Version-specific headlines appear in the [](../releases/index.md). ::: +++ diff --git a/figures/diagrams/benchmark-2026-rc.png b/figures/diagrams/benchmark-2026-rc.png index 5a75fac3..7a86cd85 100644 Binary files a/figures/diagrams/benchmark-2026-rc.png and b/figures/diagrams/benchmark-2026-rc.png differ diff --git a/figures/figures.csv b/figures/figures.csv index cf21e546..74560dd0 100644 --- a/figures/figures.csv +++ b/figures/figures.csv @@ -18,4 +18,4 @@ ghg-pipeline,ee/index.md,diagram (SVG),hand-made,,,draft eeio-overview,intro/what-is-eeio.md,diagram (SVG),hand-made,,,draft user-guidance-ef-by-country,factors/user-guidance.md,chart,"Cornerstone GHG Emission Factors workbook, 2026-rc (2026PRO, sector 541610)",figures/scripts/user_guidance_figures.py,Yohanna Maldonado,draft user-guidance-worked-example,factors/user-guidance.md,diagram,"Worked example from the 2026-rc workbook (factor 0.0449; GBP rate 0.74283)",figures/scripts/user_guidance_figures.py,Yohanna Maldonado,draft -benchmark-2026-rc,benchmarking/index.md,chart,"EF benchmark comparisons for 2026-rc (share of country-sector pairs vs third-party references)",,Ben Young,draft +benchmark-2026-rc,releases/rc.md,chart,"EF benchmark comparisons for 2026-rc (61 / 18 / 9 of 88 sectors; model D from cornerstone_2026_v0_7, ceda 03facf41)",figures/scripts/benchmark_figures.py,Ben Young,draft diff --git a/figures/scripts/benchmark_figures.py b/figures/scripts/benchmark_figures.py new file mode 100644 index 00000000..dd82203f --- /dev/null +++ b/figures/scripts/benchmark_figures.py @@ -0,0 +1,77 @@ +"""Write the benchmarking results donut to figures/diagrams/benchmark-2026-rc.png. + +Redraws the slide-deck donut with the release's numbers. Each of the 88 benchmarked sectors falls in +one band by its gap, |model D - benchmark| / benchmark, with model D from the v1.0 release diagnostics +(cornerstone_2026_v0_7, ceda commit 03facf41): + +- within 25% of the benchmark: 61 sectors +- 25-50% gap: 18 sectors +- 50% or more gap: 9 sectors + +Each percentage is rounded to the nearest whole percent, halves up (69.32%, 20.45% and 10.23% show +as 69%, 20% and 10%), so the labels add to 99%. + +Run from the repo root (needs matplotlib): + uv run --with matplotlib python figures/scripts/benchmark_figures.py +""" +from decimal import ROUND_HALF_UP, Decimal +from pathlib import Path + +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt # noqa: E402 +from matplotlib.patches import Circle, Wedge # noqa: E402 + +OUT = Path(__file__).resolve().parents[1] / "diagrams" +TITLE, INK, MUTED = "#2F6F67", "#2C3746", "#6A727C" +BANDS = [ # (label, sectors, colour) + ("Within 25% of benchmark", 61, "#2F5D8A"), + ("25–50% gap", 18, "#D5D8DC"), + ("50% or more gap", 9, "#7D848D"), +] +plt.rcParams.update({"font.family": ["Helvetica", "Arial", "DejaVu Sans"]}) + + +def donut(): + counts = [n for _, n, _ in BANDS] + total = sum(counts) + pcts = [int((Decimal(100 * n) / total).quantize(Decimal(1), rounding=ROUND_HALF_UP)) for n in counts] + + fig = plt.figure(figsize=(6.2, 5.7), dpi=200) + ax = fig.add_axes([0, 0, 1, 1]) + ax.set_xlim(0, 620) + ax.set_ylim(570, 0) + ax.axis("off") + + ax.text(28, 26, "How Cornerstone compares to third-party references", color=TITLE, fontsize=14.5, + fontweight="bold", va="center") + + cx, cy, r_out, r_in = 310, 231, 158, 103 + # The y axis runs top-down, so data angles turn clockwise on the page; -90 is 12 o'clock. + start = -90.0 + for (_, n, colour) in BANDS: + sweep = 360 * n / total + ax.add_patch(Wedge((cx, cy), r_out, start, start + sweep, width=r_out - r_in, facecolor=colour, + edgecolor="white", linewidth=1.5)) + start += sweep + + ax.text(cx, cy - 18, f"{pcts[0]}%", color=BANDS[0][2], fontsize=34, fontweight="bold", ha="center", + va="center") + ax.text(cx, cy + 30, "within 25% of\nbenchmark", color=INK, fontsize=11, ha="center", va="center", + linespacing=1.4) + + for i, ((label, _, colour), pct) in enumerate(zip(BANDS, pcts)): + y = 431 + 32 * i + ax.add_patch(Circle((37, y), 9, facecolor=colour, edgecolor="none")) + ax.annotate(label, (65, y), color=INK, fontsize=12.5, va="center") + ax.annotate(f" {pct}%", (1, 0.5), xycoords=ax.texts[-1], color=INK, fontsize=12.5, + fontweight="bold", va="center") + + ax.text(38, 531, f"Share of the {total} benchmarked sectors", color=MUTED, fontsize=10.5, va="center") + fig.savefig(OUT / "benchmark-2026-rc.png", facecolor="white") + plt.close(fig) + + +if __name__ == "__main__": + donut() diff --git a/releases/rc.md b/releases/rc.md index eddcf7d6..29a065c6 100644 --- a/releases/rc.md +++ b/releases/rc.md @@ -42,6 +42,24 @@ Three groups of improvements sit behind the changes. Together these make the 2017–2026 time series possible. +## Benchmarking results + +:::{figure} ../figures/diagrams/benchmark-2026-rc.png +:label: fig-benchmark-2026-rc +:alt: Donut chart titled How Cornerstone compares to third-party references. 69 percent of the 88 benchmarked sectors fall within 25 percent of the benchmark; 20 percent have a 25 to 50 percent gap; 10 percent have a gap of 50 percent or more. +Share of the 88 benchmarked sectors. 69% fall within 25% of the benchmark; the rest have larger gaps. +::: + +We benchmarked the direct emission factor (`D`) of 88 sectors, chosen because they drive a large share of emissions. Together they account for about 52% of global direct emissions in the model. + +| Measure | Sectors | Share of the 88 sectors | Share of global direct emissions | +|---|---|---|---| +| Within 25% of the benchmark | 61 | 69% | 46% | +| Manually reviewed | 47 | 53% | 36% | +| Manually reviewed, or within 25% of the benchmark | 78 | 89% | 50% | + +A sector counts as manually reviewed when someone investigated its gap and reached one of the three outcomes in [](../benchmarking/index.md): a sharper benchmark, a model improvement, or a documented difference. Sectors within 25% of the benchmark were not all reviewed in this depth, because the gap gave no reason to. + ## Why do these improvements matter? They translate real world changes to corporate footprints. Three examples show how: