cartography
Skill0 starsChanged 53 days agoApache-2.0View on GitHub
Publication-quality maps with cartopy: projections, uniform colormaps, stippling and uncertainty visualization, multi-panel layouts, Hovmoller.
3 other projects use a version of this.
Adopted by
Most recently taken up by
- TerraLabAI/geoai-skillstheir own version, first seen Nov 1, 2026
- matthewharrilal/claude-skillstheir own version, first seen Oct 13, 2026
- AlmxndBL/Apex-coretheir own version, first seen Aug 29, 2026
Other versions3 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 3
- AlmxndBL/Apex-core★ 1same name
- matthewharrilal/claude-skills★ 0same name
- TerraLabAI/geoai-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository11 other files it gives its agents.
- analysis-reviewSkill
- basic-statisticsSkill
- consult-knowledgeSkill
- data-formatsSkill
- discover-dataSkill
- quality-controlSkill
- reportSkill
- reproducibilitySkill
- startSkill
- uncertainty-quantificationSkill
- xarray-fundamentalsSkill
The file
We split this skill into the rules it gives an agent
9 rules. 0 are common, 8 are distinctive, and 1 is very specific to this project.
0
Common
Most of the 3 edited versions we read keep these.
8
Distinctive
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 68
Do not create a huge figure and shrink it in a document.
- Distinctive: line 86
When most of the field is significant, stippling the significant area blackens the map.
- Distinctive: line 132
Every band, hatch, and stipple is defined in the caption with method and level.
- Distinctive: line 137
Never use jet or rainbow colormaps, or a diverging map without a physically meaningful, pinned center.
- Very specific: line 139
Never omit transform= on GeoAxes plotting calls.
- Distinctive: line 140
Never plot comparable panels with unshared color scales or unlabeled colorbars.
- Distinctive: line 142
Never mark stippling, hatching, or bands without defining test, level, and meaning in the caption.
- Distinctive: line 144
Never present an interpolated or ML-derived surface to stakeholders without its adjacent uncertainty map.
- Distinctive: line 146
Never export print figures below 300 dpi or with fonts under 7 pt at final size.
“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
cartography
Background expertise for maps and figures that survive review.
Projections
- Global fields: Robinson or Equal Earth for presentation (area impressions matter); PlateCarree is a working view, not a publication default, because it exaggerates high latitudes.
- Polar: NorthPolarStereo / SouthPolarStereo with
set_extentand a circular boundary path; never show polar fields on PlateCarree. - Regional midlatitude: LambertConformal centered on the domain.
- Always pass
transform=ccrs.PlateCarree()(or the data's actual CRS) to every plotting call on a GeoAxes. Omitting it is the classic silent bug: data draws in projection coordinates and lands in the wrong place or not at all. - Global longitudes need a cyclic point
(
cartopy.util.add_cyclic_point) or a seam gap appears at the dateline or prime meridian. - Coastlines at the resolution the domain needs (
'110m'global,'50m'regional); gridline labels on, ticks meaningful.
Colormaps: perceptually uniform, matched to the variable
Rules: sequential colormaps for magnitudes, diverging only when the field
has a physically meaningful center (zero anomaly, zero trend, zero
divergence), and the center pinned there (vmin=-vmax, or
TwoSlopeNorm when the range is asymmetric). Never jet or rainbow;
perceptual banding manufactures features that are not in the data.
cmocean table (fall back to viridis/cividis and RdBu_r when cmocean is unavailable):
| Field | cmocean | Type |
| temperature, SST | thermal | sequential |
| anomalies, trends, budgets, divergence | balance | diverging |
| salinity | haline | sequential |
| velocity or speed magnitude | speed | sequential |
| vorticity, curl | curl | diverging |
| sea ice concentration | ice | sequential |
| precipitation, moisture | rain (rate) / tempo (accumulating) | sequential |
| bathymetry, topography | deep / topo | sequential / split |
| dissolved oxygen | oxy | sequential with thresholds |
| chlorophyll, biomass | algae | sequential |
| cyclic phase (direction, season, tide phase) | phase | cyclic |
| model-obs or version differences | diff | diverging |
State units on every colorbar label; a colorbar without units is a finding in review.
Figure sizes
| Context | Width | Fonts at final size |
| single-column journal figure | 3.5 in / 89 mm | >= 7 pt |
| double-column journal figure | 7.2 in / 183 mm | >= 7 pt |
| slide (16:9) | 13.3 x 7.5 in | >= 18 pt |
Set the true final size at creation (figsize=), use
constrained_layout=True, export vector (PDF/SVG) or >= 300 dpi raster.
Do not create a huge figure and shrink it in a document; fonts and line
widths shrink with it.
Stippling and significance marking
Mark per-cell statistical significance on trend or composite maps with stippling or hatching over the field:
cf = ax.contourf(lon, lat, slope, levels=levels, cmap=cmap,
transform=ccrs.PlateCarree())
ax.contourf(lon, lat, pvals < 0.05, levels=[0.5, 1.5],
colors="none", hatches=[".."], transform=ccrs.PlateCarree())- The caption defines the marking, always: which test, which level ("stippling: p < 0.05, Hamed-Rao modified Mann-Kendall"), and what the stippled state is.
- When most of the field is significant, stippling the significant area blackens the map; mark the NON-significant regions instead and say so.
- Per-cell significance is not field significance; basic-statistics carries the FDR rule for map-wide claims.
Multi-panel layouts
- Build with
plt.subplots(..., subplot_kw={"projection": proj}, constrained_layout=True); label panels (a), (b), (c). - Panels that invite comparison share one colorbar: same levels and
norm on every panel, one
fig.colorbar(mappable, ax=axs)for the set. Per-panel colorbars with different ranges on comparable fields is a review finding; use them only when panels show different variables. - Seasonal panel sets (DJF/MAM/JJA/SON) follow the QS-DEC convention from basic-statistics; label seasons, not month triplets.
Hovmoller diagrams
Time against longitude (or latitude): pcolormesh or contourf with
time on the vertical axis, stated direction (increasing downward matches
reading order for forecasts; increasing upward matches time series
intuition; pick one and label it), anomalies on a centered diverging map,
and the averaged-over band stated in the title (for example "5S-5N mean").
Uncertainty visualization
Per the specification's cartography requirements (docs/SPECIFICATION.md in open-science-pillars/marketplace), this section is load-bearing, not decoration:
- Interval bands on time series:
fill_betweenaround the line, the method and level in the label ("95% CI, block bootstrap"), band drawn under the line, alpha kept legible in print. - Spread maps: an ensemble mean map is accompanied by a spread map (standard deviation or IQR, sequential colormap), same projection and extent, side by side.
- Agreement maps and hatching: for multi-member results, map the fraction of members agreeing on sign; hatch regions of LOW agreement (state the threshold, for example "hatching: fewer than 80% of members agree on sign"). Hatching low agreement keeps the visually quiet regions trustworthy.
- The pairing rule: any interpolated or machine-learning-derived surface presented to stakeholders ships with an adjacent uncertainty map (prediction standard error, cross-validation error, or ensemble spread). A kriged or ML surface without its uncertainty panel is not presentable.
- Every band, hatch, and stipple is defined in the caption with method and level; an undefined marking is worse than none.
Must NOT
- Never use jet or rainbow colormaps, or a diverging map without a physically meaningful, pinned center.
- Never omit
transform=on GeoAxes plotting calls. - Never plot comparable panels with unshared color scales or unlabeled colorbars.
- Never mark stippling, hatching, or bands without defining test, level, and meaning in the caption.
- Never present an interpolated or ML-derived surface to stakeholders without its adjacent uncertainty map.
- Never export print figures below 300 dpi or with fonts under 7 pt at final size.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

