Add inverted-axis and aspect-ratio sins; rename slugs

Writes two sins off the backlog. The inverted y-axis is the egregious
one: the fill hangs from the top and the line descends while the values
climb, with every element individually defensible. Aspect ratio is the
quiet one: same twelve numbers, same y-range, only the shape of the box
changes.

Adds Cleveland, McGill & McGill 1988 to the canon — banking to 45 comes
from the shape-parameter paper, not the 1984 ranking already cited, so
citing the latter for it would have misattributed the claim.

Also renames sin slugs to match their retitled pages, and rewrites the
summaries that had started echoing those titles.

Gives line-chart points their mark color explicitly; "point": true was
falling back to Vega's default blue on a red or green line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ULE5RRxdQE1ebwefEd2eCM
This commit is contained in:
Claude
2026-08-05 17:00:20 +00:00
parent 458ccaeb17
commit 37d8631903
13 changed files with 359 additions and 73 deletions
+93 -64
View File
@@ -5,21 +5,29 @@ condemned by something already in the canon** (`src/lib/references.ts`). We
don't invent authority, so the backlog is mined *from* the sources rather than
brainstormed and back-filled with citations.
The list deliberately mixes registers. Some sins are subtle enough that a
competent analyst commits them by accident; others are arithmetically void and
indefensible on sight. Both belong — the egregious ones are the most *sendable*
pages we can write, because there's nothing to argue about, and the subtle ones
are what keep the site useful to people who already know the basics. Severity
runs 25 on purpose.
## Canon coverage
Which references are already doing work, after the first three sins:
Which references are doing work, after the first five sins:
| Reference | Cited by |
| --- | --- |
| `callingbullshit` | truncated-y-axis |
| `clevelandmcgill` | truncated-y-axis, pie-chart-overload |
| `callingbullshit` | truncated-y-axis, inverted-y-axis |
| `clevelandmcgill` | truncated-y-axis, too-many-pie-slices, aspect-ratio |
| `tufte` | truncated-y-axis |
| `howchartslie` | truncated-y-axis, dual-axis-deception |
| `datatoviz` | dual-axis-deception, pie-chart-overload |
| `spurious` | dual-axis-deception |
| `swd` | dual-axis-deception |
| `fewpies` | pie-chart-overload |
| `junkcharts` | pie-chart-overload |
| `howchartslie` | truncated-y-axis, two-y-axes, inverted-y-axis, aspect-ratio |
| `datatoviz` | two-y-axes, too-many-pie-slices |
| `spurious` | two-y-axes |
| `swd` | two-y-axes |
| `fewpies` | too-many-pie-slices |
| `junkcharts` | too-many-pie-slices, inverted-y-axis |
| `shapeparameter` | aspect-ratio |
| **`munzner`** | — |
| **`wilke`** | — |
| **`healy`** | — |
@@ -41,8 +49,7 @@ sits on. The backlog is ordered to bring them all in.
The trend runs one way over five years and the other way over five months, so
the chart shows the five months. Nothing about the chart is technically false —
the axis starts at zero, the labels are honest — which is what makes it the
nastiest sin on this list and a good counterweight to the three scale/type sins
we already have.
nastiest sin on this list.
**Charts:** one series, two views. Bad = the flattering slice. Fixed = the full
record with the slice shaded in place. Literally the same dataset filtered, so
@@ -52,21 +59,64 @@ we can build.
**Citations:** `huff` (the original con), `callingbullshit`, `howchartslie`,
`junkcharts`.
### 2. Group Averages Shown Without the Distribution — *Hiding the Data*, severity 4
### 2. Pie Slices That Sum to More Than 100% — *Impossible Wholes*, severity 5
**Poke:** "Your slices add up to 180%. A pie has one job — dividing a whole —
and this data has no whole to divide."
The multi-select survey is the classic source: "which of these tools do you
use?", respondents tick three each, and the results get poured into a pie. The
wedges are now sized as fractions of a total that doesn't exist, so every one of
them is drawn wrong, and the "share" each appears to hold is pure artifact.
Unlike most of this list, there's no judgment call — the chart is arithmetically
void. That's the appeal: nothing to argue about, and no way to defend it in a
meeting.
**Charts:** bad = pie of multi-select response counts, wedges summing past the
circle. Fixed = bar chart, one bar per option, each labelled "% of respondents"
with the base stated. Same counts.
**Citations:** `fewpies`, `datawrapper` (their pie-chart guidance covers when the
form applies at all), `datatoviz`, `junkcharts`.
### 3. A Pie Chart of Rates or Averages — *Impossible Wholes*, severity 5
**Poke:** "You made a pie out of averages. Adding them together produces a
number that means nothing, and that number is your denominator."
The other half of the same mistake, and the one people defend for longer.
Average deal size by region, conversion rate by channel, satisfaction score by
team — relative metrics, each with its own denominator, stacked into wedges as
if they were parts of a shared total. A region with a high *average* takes a big
slice regardless of how many deals it actually did.
Worth its own page rather than folding into the entry above: the tell is
different (these numbers *can* sum to 100% by coincidence), and the person who
needs sending here is making a different error — a category mistake about what
their metric is, not a counting mistake.
**Charts:** bad = pie of average order value by region. Fixed = bar chart of the
same averages, plus the volume behind each one so the weighting is visible.
**Citations:** `fewpies`, `munzner` (part-to-whole is a composition of a whole,
or it is nothing), `schwabish`, `ftvisvocab`.
### 4. Group Averages Shown Without the Distribution — *Hiding the Data*, severity 4
**Poke:** "Four bars, four averages, and no idea whether the difference is real."
The bar-of-means: every group collapsed to one number, so wildly different
distributions draw identical bars. Wilke devotes a section to exactly this and
Healy makes the perceptual case; it's the natural home for three of our six idle
references at once.
Healy makes the perceptual case; it's the natural home for three idle references
at once.
**Charts:** bad = grouped bar of means. Fixed = strip/box plot over the same
observations, means still marked.
**Citations:** `wilke`, `healy`, `schwabish`, `datatoviz`.
### 3. Bubbles Sized by Radius Instead of Area — *Perceptual Traps*, severity 4
### 5. Bubbles Sized by Radius Instead of Area — *Perceptual Traps*, severity 4
**Poke:** "You doubled the number and quadrupled the ink."
@@ -82,7 +132,28 @@ position does the work.
**Citations:** `munzner`, `clevelandmcgill`, `tufte`, `howchartslie`.
### 4. Categories Sorted Alphabetically Instead of by Value — *Sloppy Craft*, severity 2
### 6. Stacked Segments Without a Shared Baseline — *Perceptual Traps*, severity 3
**Poke:** "Only the bottom band of a stacked chart has a straight edge to
measure against. The rest are guesses."
In a stacked column chart, every segment except the bottom one starts at a
baseline that moves from column to column, so readers can compare the total and
the bottom series — and nothing else. The series you actually care about is
usually floating somewhere in the middle. Datawrapper's guidance is blunt about
it: bring the most important value to the bottom, because readers can only
compare values that share a baseline.
Ubiquitous in business dashboards, which is what earns it a slot despite the
milder severity.
**Charts:** bad = stacked columns with the interesting series stranded in the
middle. Fixed = the same numbers as small multiples (or the key series pulled
out to its own zero baseline), totals preserved.
**Citations:** `datawrapper`, `wilke`, `munzner`, `ftvisvocab`.
### 7. Categories Sorted Alphabetically Instead of by Value — *Sloppy Craft*, severity 2
**Poke:** "Your categories are sorted by name. Nobody wants to know which
region starts with A."
@@ -96,48 +167,6 @@ sorted by value.
**Citations:** `schwabish`, `ftvisvocab`, `swd`, `fewpies`.
### 5. Stacked Segments Without a Shared Baseline — *Perceptual Traps*, severity 3
**Poke:** "Only the bottom band of a stacked chart has a straight edge to
measure against. The rest are guesses."
In a stacked column chart, every segment except the bottom one starts at a
baseline that moves from column to column, so readers can compare the total and
the bottom series — and nothing else. The series you actually care about is
usually floating somewhere in the middle. Datawrapper's guidance is blunt about
it: bring the most important value to the bottom, because readers can only
compare values that share a baseline.
Ubiquitous in business dashboards and highly sendable, which is why it outranks
the two below despite a milder severity.
**Charts:** bad = stacked columns with the interesting series stranded in the
middle. Fixed = the same numbers as small multiples (or the key series pulled
out to its own zero baseline), totals preserved.
**Citations:** `datawrapper`, `wilke`, `munzner`, `ftvisvocab`.
### 6. An Inverted Y-Axis — *Misleading Scales*, severity 5
**Poke:** "Down means up. You flipped the axis and the trend flipped with it."
The famous one. High drama, trivial to author (`scale: {reverse: true}`), and it
slots into an existing category. Ranked below the others only because the canon
support overlaps almost entirely with sins we've already published.
**Citations:** `callingbullshit`, `howchartslie`, `junkcharts`.
### 7. Aspect Ratio That Exaggerates a Trend — *Misleading Scales*, severity 3
**Poke:** "Same data, twice as tall. Aspect ratio is not a styling choice."
Cleveland's banking-to-45° argument: the identical series reads as a crisis or a
plateau depending on the box you draw it in. Cheap to author — one dataset, two
`width`/`height` pairs — and a rare sin where the bad chart contains no false
statement at all.
**Citations:** `clevelandmcgill`, `howchartslie`, `wilke`.
## Not yet buildable
Real sins, but our pipeline can't prove them honestly today. Recorded so we stop
@@ -149,12 +178,12 @@ rediscovering them:
- **Counts on a choropleth instead of rates** (Cairo's set-piece) — needs
TopoJSON geometry and a build-time data dependency we don't have yet. Strong
candidate the moment we take that on.
- **Rainbow color scales for continuous data** (Wilke, Munzner, and now
Datawrapper's four-part color-scale series — the best free treatment of this
anywhere) — the canon backing is no longer the constraint. What still blocks
it is ours: the fixed chart needs a sequential ramp validated on
`--chart-canvas` in both themes. Do the palette work first (`dataviz` skill +
its validator), then this is ready to write.
- **Rainbow color scales for continuous data** (Wilke, Munzner, and Datawrapper's
four-part color-scale series — the best free treatment of this anywhere) — the
canon backing is no longer the constraint. What still blocks it is ours: the
fixed chart needs a sequential ramp validated on `--chart-canvas` in both
themes. Do the palette work first (`dataviz` skill + its validator), then this
is ready to write.
## Conventions reminder