Skip to main content

ipcc-wg1-scientific-plotting-skill

Evidence-backed visual grammar and fidelity checks for IPCC AR6 WGI scientific figures.

source → profile → render → audit → reproduce

CI Reference reproductions Python AR6 WGI Fidelity

Not a Matplotlib theme. The project encodes AR6/WGI visual semantics, delivery geometry, official colour assets, uncertainty grammar, provenance, and machine-checkable fidelity.

From styling to fidelity

Four-panel comparison from Matplotlib defaults and IPCC-ish styling to adapted and strict-contract AR6 visual grammar

The same synthetic SSP trajectories are shown four ways: Matplotlib defaults, appearance-only “IPCC-ish” styling, an explicit adapted profile, and the stricter ar6-report contract. The point is not that the fourth mini-panel is itself an official IPCC figure; it is that a fidelity claim needs semantic tokens, an explicit profile, audit gates, and disclosed requirements rather than visual resemblance alone.

The comparison is reproducible with examples/visual_comparison.py; PNG and SVG outputs plus the interpretation boundary live in examples/visual_comparison/.

See the reference reproductions first

These figures are regenerated from pinned official IPCC AR6 WGI source repositories, not synthetic demo data. Source commits, physical dimensions, and SHA256 checksums are recorded in the reference gallery and manifest.

Chapter 3 — Figure 3.2b
Scatter + fitted relationship.

Chapter 3 Figure 3.2b reproduction
Chapter 10 — Figure 10.20b
Mediterranean station map.

Chapter 10 Figure 10.20b reproduction
Chapter 2 — Figure 2.3
Paleo CO₂ proxies + uncertainty.

Chapter 2 Figure 2.3 reproduction
Chapter 6 — Figure 6.18 source
Historical + scenario CH₄ emissions.

Chapter 6 Figure 6.18 source reproduction

Why this is different

A lot of “IPCC-style” plotting stops at a diverging palette, a sans-serif font, and some hatching. This repository treats AR6 WGI as a visual system with evidence and failure conditions, not a theme.

  • Evidence-backed rules — WGI guides, TSU review comments, official colormaps, chapter code, Atlas guidance, and published reference figures are kept distinct.
  • Semantic colour — SSP/RCP colours and variable-specific map palettes carry meaning; they are not a decorative colour cycle.
  • Explicit fidelity modes — strict/IPCC-faithful and adapted/IPCC-inspired are separate claims.
  • Fail-closed strict mode — no silent fallback to viridis, RdBu, cmocean, or an arbitrary font while still claiming fidelity.
  • Method ≠ style — median, 17–83%, 80% agreement, FDR, weighting, and projection remain analysis/reference choices unless evidence says otherwise.
  • Auditable outputs — physical dimensions, typography, semantic colours, official-colormap use, provenance, and reference regressions can be checked.

The goal is not to make a plot look vaguely IPCC-ish. The goal is to make the fidelity claim inspectable.

Audit the fidelity claim

The audit layer is designed for both humans and CI. Existing code can keep using audit_figure(fig); new integrations can use the structured audit_figure_report(fig) API or the ar6plot CLI.

A figure script exposes a zero-argument factory returning a Matplotlib Figure:

def make_figure():
    ...
    return fig

Run the machine-checkable contract:

ar6plot audit examples/audit_demo.py --strict-dimensions

Example report:

AR6 fidelity audit — PASS
Profile: ar6-report

PASS  text.unit-convention         axis and annotation unit syntax passed
SKIP  typography.arial             strict font check not requested
PASS  delivery.width               figure width matches an IPCC delivery width
PASS  delivery.height              figure height is within the delivery maximum
PASS  scenario.color.0.0           scenario 'SSP1-2.6' uses the ar6-report semantic colour
PASS  scenario.color.0.1           scenario 'SSP2-4.5' uses the ar6-report semantic colour
PASS  scenario.color.0.2           scenario 'SSP5-8.5' uses the ar6-report semantic colour
SKIP  map.official-colormap        official map-colormap check not requested
SKIP  reference.manual-review      projection, panel geometry, annotation, and scientific method require reference-specific review

Summary: 6 passed, 0 failed, 3 skipped

For CI and other tooling:

ar6plot audit examples/audit_demo.py \
  --strict-dimensions \
  --format json \
  --output outputs/audit.json

Exit codes are deliberate: 0 = all requested machine checks pass, 1 = one or more checks fail, 2 = the audit could not run. Exact reproduction still requires the explicitly reported manual/reference-specific checks.

Quick start

Requires Python 3.11+.

python -m pip install ar6-sciplot

The PyPI distribution is named ar6-sciplot; the Python import remains ipcc_sciplot.

Run a minimal, copy-pasteable example:

import matplotlib.pyplot as plt
import numpy as np

from ipcc_sciplot import audit_figure, axis_label, publication_context, scenario_style

year = np.arange(2015, 2101)
warming = np.linspace(1.1, 2.7, year.size)
style = scenario_style("SSP2-4.5", profile="ar6-report")

with publication_context(width="double", strict_font=False):
    fig, ax = plt.subplots()
    ax.plot(year, warming, color=style.color, label="SSP2-4.5")
    ax.set_xlabel("Year")
    ax.set_ylabel(axis_label("Temperature change", "°C"))
    ax.legend()

issues = audit_figure(
    fig,
    profile="ar6-report",
    strict_font=False,
    strict_dimensions=True,
)

print("fidelity audit:", issues or "passed")
plt.show()

This first run deliberately allows a font substitution. A figure should only be called strictly IPCC-faithful when all strict requirements are satisfied, including Arial where required.

For map/climate workflows:

python -m pip install "ar6-sciplot[climate]"
git clone https://github.com/IPCC-WG1/colormaps.git
export IPCC_WG1_COLORMAPS_DIR=/path/to/colormaps

Strict maps load the official WGI colormap assets directly and intentionally have no generic palette fallback.

Choose the fidelity contract

Goal Profile / mode Contract
Reproduce a published AR6 figure ar6-report + strict Match the published figure first, then contemporaneous AR6 guidance and source code.
Create a new figure using the updated WGI guidance wgi-guide-2022 + strict Use the June-2022 guide explicitly rather than silently rewriting final-report semantics.
Use the visual language with documented substitutions adapted / IPCC-inspired Substitutions are allowed, but the result must not be labelled exact or faithful.

Two style profiles are explicit and are never silently mixed:

ar6-report       → final-report-era AR6 semantics
wgi-guide-2022   → June-2022 WGI guide update

Execution model

SOURCE → PROFILE → FIGURE CONTRACT → RENDER → AUDIT → REFERENCE
Stage Question
Source Which WGI evidence or published figure defines the rule?
Profile Are we reproducing final-report AR6 or using the 2022 guide?
Figure contract What quantity, geometry, uncertainty method, palette, projection, and output size are required?
Render Which archetype and semantic tokens apply?
Audit What can be machine-checked, and what still needs visual comparison?
Reference Can the output be regenerated from pinned source data and verified by SHA256?

What is encoded

delivery
  ├── 90 / 180 mm print widths
  ├── ≤ 250 mm height
  ├── 9 / 11 pt WGI typography
  ├── 0.5 pt axis grammar
  └── 350 ppi raster master

semantics
  ├── SSP / RCP colours
  ├── WGI generic line colours
  ├── variable-specific official colormaps
  └── report-era vs 2022 profiles

uncertainty
  ├── model agreement
  ├── insufficient data
  └── statistical significance

qa
  ├── text + unit conventions
  ├── semantic colour audit
  ├── physical-size audit
  ├── official-colormap audit
  └── source-data regression gallery

Repository map

ipcc-wg1-scientific-plotting-skill/
├── SKILL.md                         # skill contract + routing
├── scripts/ipcc_sciplot/
│   ├── tokens.py                    # semantic WGI colours + design tokens
│   ├── colormaps.py                 # official WGI asset loader
│   ├── style.py                     # delivery geometry + typography
│   ├── archetypes.py                # recurring figure families
│   ├── maps.py                      # map context + uncertainty layers
│   ├── fidelity.py                  # machine-checkable fidelity audit
│   ├── uncertainty.py               # statistical helpers, not style defaults
│   └── provenance.py                # reproducibility metadata
├── references/
│   ├── SOURCES.md                   # source hierarchy
│   ├── evidence_matrix.md           # rule → evidence → scope → confidence
│   ├── ipcc_visual_grammar.md        # canonical visual grammar
│   ├── figure_archetypes.md          # figure-family rules
│   ├── fidelity_checklist.md         # strict gate
│   └── statistical_rules.md          # method/style separation
├── examples/
│   ├── quickstart.py
│   └── ipcc_reference/              # pinned source-data regressions
├── templates/
│   └── figure_recipe.yaml
└── tests/

Verification

Run the local contract:

ruff check .
pytest -q
python examples/quickstart.py
python scripts/check_figure.py   outputs/quickstart.pdf   --metadata outputs/quickstart.provenance.json

Rebuild the pinned IPCC reference gallery:

python -m pip install cartopy
python examples/ipcc_reference/generate_all.py
git diff --exit-code -- examples/ipcc_reference/outputs

CI covers Python 3.11 and 3.12. The reference workflow regenerates the four official-source cases and fails if the committed gallery drifts.

Evidence model

The source hierarchy is deliberately explicit:

published reference figure
        ↓
WGI visual guidance + TSU review evidence
        ↓
official IPCC-WG1 colour assets
        ↓
chapter / final-figure implementation code
        ↓
Atlas uncertainty guidance
        ↓
general scientific-visualisation practice

Start with:

The boundary

This repository does not claim that one Matplotlib theme can represent all of AR6 WGI.

It also does not turn scientific-method choices into fake visual defaults.

17–83% range       ≠ IPCC style
80% agreement      ≠ IPCC style
median             ≠ IPCC style
equal-model weight ≠ IPCC style
Robinson           ≠ universal IPCC projection

Those choices belong to the analysis or the published reference figure.

License and third-party material

Original project code and documentation are licensed under the MIT License.

That license does not relicense IPCC figures, source data, colour assets, chapter code, fonts, or other third-party material referenced or fetched by the reproducibility workflows. See THIRD_PARTY_NOTICES.md and the source corpus before redistributing upstream material.

This is an independent project. It is not an official IPCC product and does not imply IPCC endorsement.


Source it. Encode it. Render it. Prove it.

Release files for ar6-sciplot 2.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ar6-sciplot 2.2.0
File Size Uploaded
ar6_sciplot-2.2.0.tar.gz 1.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for ar6-sciplot 2.2.0
File Interpreter ABI Platform
ar6_sciplot-2.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.3 MB

Release files / ar6_sciplot-2.2.0.tar.gz

Download URL ar6_sciplot-2.2.0.tar.gz
Size 1.3 MB
Tags Source
SHA-256 checksum
How to use checksums
6ad4ce7066b4fbc7e9c9b53c94bced245be7535aa1878c01f3748ac336878c3d
BLAKE2b-256 checksum
How to use checksums
69f43c727a126c40fb6e9c9ffb85a5455800609ec9bb7f7909305fdf8714ee15
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.

Transparency log

Release files / ar6_sciplot-2.2.0-py3-none-any.whl

Download URL ar6_sciplot-2.2.0-py3-none-any.whl
Size 27.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4c58b8a4cf0ebe56ad1bcfce6da962d04f41bd8bf8d46bee240b46f1bc261ad3
BLAKE2b-256 checksum
How to use checksums
0377de7537ce09f0c1bdf5cbb7bd86cd3d89f5c873b42a73c78a5648ddb739b5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.

Transparency log

Release history Release notifications | RSS feed

2.3.0

2 release files

This release

2.2.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page