Publication-quality matplotlib/seaborn charts from a one-line prompt. Colorblind-accessible, despined, annotation-rich figures using DejaVu Sans, cubehelix/ColorBrewer palettes, and whitegrid styling. Opinionated.
![]() |
![]() |
![]() |
> make a chart of collision rates by state using the matplotlib skill
The skill picks the chart type, applies opinionated templates and palettes, and saves PDF+PNG to ./figures/.
Same data. Same prompt. The skill applies despined axes, cubehelix palettes, value labels, and insight annotations.
| Claude defaults | With skill |
|---|---|
![]() |
![]() |
git clone https://github.com/tvhahn/matplotlib-skill.git
cd matplotlib-skill
# Claude Code auto-discovers skills/matplotlib/SKILL.md when working in this repoln -s /path/to/matplotlib-skill/skills/matplotlib ~/.claude/skills/matplotlibclaude --add-dir /path/to/matplotlib-skill/plugin marketplace add tvhahn/matplotlib-skill
/plugin install matplotlib![]() P1 Horizontal Bar |
![]() P2 Vertical Bar |
![]() P3 Time Series |
![]() P4 Violin + Strip |
![]() P5 Lollipop |
![]() P6 Decision Boundary |
![]() P7 Heatmap |
![]() P8 Multi-Panel |
![]() P9 PR/ROC |
| Pattern | When to use |
|---|---|
| P1 Horizontal Bar | Ranked percentages, category comparisons |
| P2 Vertical Bar | Comparisons across categories, ranked values |
| P3 Time Series | Time series with rolling average |
| P4 Violin + Strip | Distribution comparisons |
| P5 Lollipop | Min/max/avg ranges, model comparison |
| P6 Decision Boundary | Classification boundaries, probability maps |
| P7 Heatmap | Correlation matrices, spectrograms |
| P8 Multi-Panel | Multi-panel grid layouts (2x2, 3x2, 3x3) |
| P9 PR/ROC | PR/ROC classification evaluation curves |
Above all else, show the data. Annotate the insight, not just the axis. When in doubt, remove.
Full principles
- Above all else, show the data
- Every element earns its ink
- Prefer position over color, color over size
- Grey is a color. White space is a feature.
- Despine, degrid, then add back only what the reader needs
- Annotate the insight, not just the axis
- Encode meaning twice -- never rely on color alone
- Consistency across panels; variety across charts
- The reader should never do arithmetic
- When in doubt, remove
Built through 50 iterations of automated evaluation -- an AI refining its own visual taste. Read the story on my blog →
Ships with 39 datasets for testing and demos:
- 10 source project datasets from Tim's research (bearing RUL predictions, arxiv paper labels, classifier comparisons, tool wear)
- 29 public reference datasets (penguins, gapminder, tips, iris, titanic, and more)
See data/datasets.yaml for the full manifest with attribution, licenses, and pattern mappings.
# Generate charts in a Docker clean room (Docker required)
scripts/chart-test-container.sh --quick # 5 prompts, random from pools
scripts/chart-test-container.sh # all 9 prompts, random from pools
scripts/chart-test-container.sh --fixed # all 9 prompts, original defaults
# Static analysis (fast, no Docker)
uv run scripts/evaluate_skill.py --check-rendersContributions are welcome — whether it's improving an existing pattern or adding an entirely new chart type. Some ideas to get started:
- Improve a pattern: Refine annotations, spacing, or palette choices in any of the 9 existing patterns
- Add a new chart type: Scatter plot, grouped bar chart, and
fill_betweenarea chart are all on the wishlist — or propose your own - Add datasets: New public datasets that pair well with existing or new patterns
See CONTRIBUTING.md for guidelines on modifying patterns, adding new ones, and running tests.













