agentleFS
pskoettpskoett/pmx-canvas/skills/tufte-viz/SKILL.md

tufte-viz

Skill30 starsChanged 9 days agoMITView on GitHub

Ideate and critique data visualizations using Edward Tufte's principles, and map them onto the PMX Canvas json-render chart catalog (graph / json-render nodes). Use this skill when: (1) Designing or critiquing a canvas graph/json-render chart (2) Choosing a chart type, color encoding (colorBy), or primitive (Sparkline, DotPlot, BulletChart, Slopegraph) (3) Reviewing a board's dashboards/charts for graphical integrity and data-ink (4) Deciding between a single-series bar, small multiples, or direct labeling (5) Reducing chartjunk or improving data-ink ratio on canvas charts Applies: data-ink ratio, chartjunk elimination, graphical integrity, lie factor, small multiples, data density — and the canvas colorBy decision (color must encode data, not decorate).

6 other projects use a version of this, 5 of them edited.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

8 rules. 3 are common, 3 are distinctive, and 2 are very specific to this project.

  • 3

    Common

    Most of the 6 edited versions we read keep these.

  • 3

    Distinctive

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Common:

    Start minimal, add only what's necessary

    line 37
  2. Common:

    Every element must earn its ink

    line 38
  3. Distinctive:

    Default to a single accent.

    line 39
  4. Distinctive:

    If two elements compete for the same job, keep the visual one and drop the textual one (or vice versa) - not both.

    line 46
  5. Distinctive:

    Verify baselines and scales (bar and area charts must start at zero)

    line 68
  6. Common:

    Look for 3D distortion

    line 69
  7. Very specific:

    Default to series. Do not reach for category to "make it colorful." Pie/radar/stacked-bar already rotate the palette because each …

    line 104
  8. Very specific:

    When more than ~4 series would overlap in one chart, do not cram them into a single multi-color LineChart.

    line 130

“Common” is measured: kept by at least 6 in 10 of the 6 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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Tufte Visualization Ideation (PMX Canvas)

Apply Edward Tufte's principles to design clear, honest, high-density data visualizations, then realize them with PMX Canvas graph / json-render nodes. Color must encode data, not decorate.

Workflow

For new visualizations:

  1. Clarify the data story
    • What comparisons matter?
    • What's the key insight to communicate?
    • Who's the audience?
  2. Select approach using Tufte principles:
    • High comparison need → Small multiples (several small graph nodes, shared scale)
    • Dense data → Consider data tables (json-render Table), sparklines (Sparkline)
    • Time-series → Line charts with minimal grid
    • Part-to-whole → Avoid pie charts; prefer bar/table
    • Ranked single metric across categories → DotPlot over a bar forest
  3. Design with data-ink in mind
    • Start minimal, add only what's necessary
    • Every element must earn its ink
    • Default to a single accent; use the full palette only when color encodes a variable
  4. Apply the eraser test before shipping
    • For every element (label, tick, gridline, border, annotation): can it be erased without losing information that's not already conveyed elsewhere?
    • Watch for duplicate encodings: numeric labels next to a value already marked by a tick; legends duplicating direct labels; per-panel scale annotations duplicating a shared-scale caption.
    • If two elements compete for the same job, keep the visual one and drop the textual one (or vice versa) - not both.
  5. Apply the collision test before shipping
    • For every text element in the plot (axis labels, point annotations, epoch labels, baseline labels, explanatory notes): mentally draw its bounding box. Does anything else - another text element, a data line, dense markers - live in or cross that box?
    • The eraser test catches redundant elements; the collision test catches crowded ones. Both must pass.
    • Standard fixes: move explanatory prose out of the plot into a nearby markdown node; relocate band/epoch labels to a dedicated strip above the plot; push baseline/reference labels to the outside margin; give each in-plot annotation a leader line so the marker and the text occupy clearly separated space.
    • Watch especially: inverted axes; shared-scale small multiples (labels stacked near zero in every panel); dense scatter (text vanishes into the dot cloud unless explicitly cleared).
  6. Apply the Tufte test (see references/tufte-principles.md)

For critiquing visualizations:

  1. Check graphical integrity
    • Calculate lie factor if proportions seem off
    • Verify baselines and scales (bar and area charts must start at zero)
    • Look for 3D distortion
  2. Identify chartjunk
    • Decorative elements
    • Heavy grids
    • Unnecessary 3D effects
    • Moiré patterns
    • Gratuitous per-category color on a single-series chart (decoration, not encoding)
  3. Evaluate data-ink ratio
    • What can be erased?
    • What's redundant?
  4. Suggest improvements with specific before/after recommendations

Mapping to the PMX Canvas chart catalog

Realize these designs with canvas_render { action: "add-graph" } (graph nodes) and canvas_render { action: "add-json-render" }. The chart catalog: LineChart, BarChart, PieChart, AreaChart, ScatterChart, RadarChart, StackedBarChart, ComposedChart, plus the Tufte primitives Sparkline, DotPlot, BulletChart, and Slopegraph.

Color must encode data — the colorBy decision (single-series bar/column)

A single-series BarChart measures one variable across categories. Coloring each bar differently encodes nothing — it is decoration (chartjunk). Use the colorBy prop:

colorByWhen to use
series (default)One accent for all bars, one bar highlighted (Tufte-safe emphasis). Use to draw the eye to the bar that matters (max, target, the row under discussion).
categoryOpt in only when the category itself is a nominal variable the reader must map by color (e.g. team identity reused across several charts with a shared key).
valueSequential shade by magnitude. Note this double-encodes — the bar's length already encodes the value — so reserve it for when the lightness ramp genuinely aids reading a ranked magnitude; otherwise series/none are more honest.
noneFlat single accent, no highlight. Maximal data-ink for dense small multiples.

Default to series. Do not reach for category to "make it colorful." Pie/radar/stacked-bar already rotate the palette because each slice/series is a distinct variable — leave those as-is.

Tufte primitives (prefer over heavier charts)

  • Sparkline — word-sized time-series, no axes/labels. Use inline in tables/dashboards and one per row to show a trajectory at a glance. Replaces "trending up / volatile" prose with the shape.
  • DotPlot — ranked single metric across categories. Replaces a forest of bars: a dot per category on a shared axis. Far higher data-ink ratio than bars; sorts make the macro pattern pop.
  • BulletChart — a measure against a target with qualitative bands. Replaces a gauge/dial (which is chartjunk). Use for KPI-vs-target, progress-vs-goal.
  • Slopegraph — two-time-point comparison across many categories (before/after). Direct slope encodes change and rank simultaneously; labels sit at the endpoints (direct labeling, no legend). Lines default to a single neutral ink; set colorByDirection to accent rising lines and mute falling ones only when the direction is the point (and beware it editorializes — a falling error-rate is "good", a falling revenue is "bad").

Direct labeling over legends

Legends force the eye to ping-pong between key and plot (a duplicate encoding). Prefer labeling the data directly: end-of-line labels on LineChart/Slopegraph, endpoint labels on DotPlot, the highlighted bar's value on BarChart. Set showLegend: false on graph nodes when one or two series are directly identifiable; reserve legends for genuinely many overlapping series.

Small multiples over many overlapping series

When more than ~4 series would overlap in one chart, do not cram them into a single multi-color LineChart. Create several small graph nodes with an identical shared scale and consistent encoding, arranged in a grid (canvas_view { action: "arrange", layout: "grid" }, or a group). Position means the same thing in every panel; the sequence tells the macro story while each panel carries the micro detail. This is almost always better than color-coding 6+ lines.

Key Principles Reference

  • references/tufte-principles.md - core principles from Visual Display of Quantitative Information: lie factor, data-ink, chartjunk, small multiples, integrity.
  • references/analytical-design.md - extensions from Envisioning Information, Visual Explanations, and Beautiful Evidence: the 6 principles of analytical design, sparklines, layering & separation, micro/macro, range-frames, causality, confections. Load when designing dashboards, dense displays, sparklines, or explanatory graphics.

Quick checklist:

  • Lie Factor ≈ 1.0 (no visual distortion; bars and areas start at zero)
  • Maximum data-ink ratio
  • Zero chartjunk (no per-category color unless color encodes a variable)
  • colorBy chosen deliberately — default series (single accent + one highlight); avoid value unless the magnitude ramp earns the double-encode
  • Clear labeling, direct over legend
  • Answers "compared to what?"
  • Shows causality or mechanism where relevant
  • Multivariate (not over-reduced)
  • Words, numbers, images integrated - not segregated
  • Reveals multiple levels of detail (micro + macro)
  • Layering: primary data dominates, secondary recedes
  • Appropriate data density — Sparkline/DotPlot considered before a heavier chart
  • >4 overlapping series → small multiples, not one rainbow chart

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.