Skip to content
Back to skills

Evident Charts

ASecurity

Makes explanatory charts whose point is evident, using evidence-tagged dataviz rules. Use whenever you create, revise, restyle, or review a chart, plot, graph, or figure meant to show a reader something: matplotlib, seaborn, pandas .plot, ggplot2, Plotly, Altair/Vega-Lite, D3, or any PNG/SVG chart for a blog, report, paper, slide, newsletter, or social post. Starts from sound analysis of the data, picks the chart type from the takeaway and data shape, and runs deterministic checks (overlaps, ...

  • 39 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 30, 2026
researchpython

Works with

  • claude code

Security analysis

A100/100

Pro scans all 19 files and shows the line behind each finding

Scanned September 30, 2026

npx -y skills add ericmjl/skills --skill evident-charts --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Evident Charts?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Evident Charts
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/ericmjl-evident-charts/badge)](https://www.skillsdirectory.com/skills/ericmjl-evident-charts)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: evident-charts
description: >-
  Makes explanatory charts whose point is evident, using evidence-tagged dataviz
  rules. Use whenever you create, revise, restyle, or review a chart, plot,
  graph, or figure meant to show a reader something: matplotlib, seaborn,
  pandas .plot, ggplot2, Plotly, Altair/Vega-Lite, D3, or any PNG/SVG chart for
  a blog, report, paper, slide, newsletter, or social post. Starts from sound
  analysis of the data, picks the chart type from the takeaway and data shape,
  and runs deterministic checks (overlaps, baselines, dual axes, palettes).
  Also use for "critique this chart", "why does this plot look bad", "make this
  figure better", or a pasted chart image.
license: MIT
metadata:
  author: Randy Olson
  version: "0.1.0"
---

# evident-charts

Charts that make one point a reader gets at a glance. Paths are relative to this skill's directory (Claude Code: `${CLAUDE_SKILL_DIR}`); run `scripts/` with the project's Python.

Critique, review, or a chart image with a question: follow `references/critique.md`; otherwise the workflow below.

## Rules

Rule lines read `ID [tag] rule. Break: escape. check: name`. `[E]` experimental evidence: break only with a stated reason. `[P]` practitioner consensus: break for a clear reason. `[T]` taste: bend freely. A project's style guide overrides the house look (`assets/`) and `[T]` rules, never `[E]` integrity rules. `check:` names a `scripts/check_chart.py` check; `palette` means `scripts/check_palette.py`. Citations: `references/sources.md`, only when asked why.

## Workflow

1. **Analyze.** Load the data, print summary stats, confirm units and scope, run the checks below.
2. **Brief** in one line: `Takeaway: <claim the data supports> | Audience: <lay/expert> | Destination: <preset>`. The takeaway answers every part of the request (HI-1). Ask at most two questions, only if the takeaway is ambiguous. Presets (`assets/presets.json`): `blog` (default), `mobile` (phone, phone-read newsletters), `social` (X), `social_portrait` (LinkedIn, Instagram), `slide` (deck), `report` (print, memos, docs).
3. **Choose the form** from the takeaway and data shape; open `references/choosing.md` only when the form is not obvious. It may be a table or one hero number over a sparkline or part bar (`stats_size="hero"`, LY-6). Render alternatives (`references/candidates.md`) only when unsure between two honest forms.
4. **Build** in the project's stack; otherwise Python + matplotlib with `scripts/evident.py` (other stacks: `references/libraries.md`). Fit title and subtitle with `ev.fits_title` and `ev.fits_subtitle`.
5. **Check.** matplotlib: `python scripts/check_chart.py <chart.py> --dest <preset>` (includes color-blindness and contrast); other stacks: `python scripts/check_palette.py "<hex,...>" --role <role> --mark <mark>`. Fix all failures together.
6. **Review** the rendered PNG, never the code (`references/critique.md`, Review loop): a fresh-context subagent given only the PNG, request, and destination, else a self-review of the reopened image. Fix every P0 and P1, re-render, recheck, re-review; stop at a round without P0/P1, at most 3 rounds.
7. **Deliver** the format asked for (`report` may add a PDF): absolute paths to the image and script; the brief; analysis choices a reader should know (any transform, exclusions, thresholds, minimum n); how you identified the source, your confidence, and anything unconfirmed (SRC-1); alt text (A1); any rule broken, with the reason; the one-line review log.

## Analysis checks

- Use the field's standard comparison: same period last year, calendar months or quarters, named members the audience acts on, standard thresholds; pool, smooth, roll, or rebase only when it would mislead, named in the subtitle (H22, H24).
- Flag a preliminary last point, never pool it away; compare a partial last period like-for-like (year to date, trailing 12 months, or within the only measure covering it) (H17, H15, H12).
- Parts sum to the published total; remainder = aggregate minus members; check duplicates, sentinel codes (0, 888, 999, blank), future-dated zero rows (unreleased), split events, and frozen values; compute every number from the data (H11, H24).
- Show n or intervals for small samples, never rank tiny ones; test survey differences at the publisher's MOE level (H23, U1).

## Chart defaults

- Title answers the question as asked ("what drives X": contribution, not rate; H13); subtitle qualifies it and gives what, units, and when; source line names the real publisher and dataset, a note any data you added; nothing addressed to the user on the chart (TI-1, TI-6, SRC-1, SRC-2).
- Marks encode the title's measure by position on a common scale; lines only over ordered x (ENC-1, TIME-1).
- Bars from zero; lines use a range that fits the data (zero only for ratio claims); no dual y-axes, 3D, inverted value axes, or rainbow colormaps (H1, H2, H3, H8, H5, C11).
- One accent on gray when one element is the story; otherwise color meaningful groups; at most 4 hues (C2, C3).
- Direct labels over legends (LB-1). Up to about 10-12 marks: value labels replace the value axis, never both; show the numbers the comparison needs; context columns only if needed (VL-1, VL-2).
- Units on every tick or in the axis title; light value gridlines only; remove ink that carries no information; leave white space; text at least 12 px at display size (TI-7, GR-1, DC-1, TY-2).

## Files

Read a reference only when its decision comes up.

| File | Read when |
|---|---|
| `references/integrity.md` | An analysis, axis, scale, uncertainty, or accessibility question |
| `references/text.md` | Titles, labels, annotation, layout |
| `references/color.md` | A color decision beyond the defaults |
| `scripts/evident.py` | Optional matplotlib helper; its docstring is the usage |
| `assets/presets.json`, `assets/palettes.json` | Destination sizes and type scale; house colors |

Files in this skill

  • SKILL.md5.8 KB
  • agents/openai.yaml201 B
  • assets/evident.mplstyle2.2 KB
  • assets/palettes.json5.3 KB
  • assets/presets.json6.2 KB
  • assets/themes/evident_d3.css2.5 KB
  • assets/themes/evident_d3_tokens.js3.4 KB
  • assets/themes/evident_plotly.json2.6 KB
  • assets/themes/evident_vegalite.json2.4 KB
  • assets/themes/theme_evident.R6.4 KB
  • references/candidates.md1.6 KB
  • references/choosing.md12 KB
  • references/color.md4.2 KB
  • references/critique.md7.2 KB
  • references/integrity.md9.3 KB
  • references/libraries.md8.7 KB
  • references/sources.md29.1 KB
  • references/text.md11.2 KB
  • scripts/check_palette.py29.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…