ipcc-wg1-scientific-plotting-skill
Evidence-backed visual grammar and fidelity checks for IPCC AR6 WGI scientific figures.
source → profile → render → audit → reproduce
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
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 10 — Figure 10.20b Mediterranean station map. |
|
Chapter 2 — Figure 2.3 Paleo CO₂ proxies + uncertainty. |
Chapter 6 — Figure 6.18 source Historical + scenario CH₄ emissions. |
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)
| File | Size | Uploaded | |
|---|---|---|---|
| ar6_sciplot-2.2.0.tar.gz | 1.3 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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