Add real-world specimens and cross-links between sins

Two new levers on a sin page. `wild[]` renders credited, linked
specimens between the explanation and the citations — first the
argument, then proof people actually publish this, then the sources.
`related[]` cross-links neighbouring sins and is resolved at build, so a
typo fails the build instead of shipping a dead link.

Both arrive with the first specimen: a Hungarian primary graphic whose
three slices read 38/22/19 — 79% — drawn as a full circle, so every
share is inflated by about 1.27x. Measured off the image, the 38% slice
occupies 173.6 degrees, or 48.3% of the pie.

Our published pie sin is about too many slices, so it didn't cover this;
"Pie Slices That Don't Sum to the Whole" is a new severity-5 page whose
before/after is two pies differing only in whether the remainder is
present. That sin is an omission, so `compareNote` replaces the standard
"same numbers, both charts" 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 20:45:23 +00:00
parent 444b89660f
commit 673f265398
17 changed files with 453 additions and 15 deletions
+47 -12
View File
@@ -17,7 +17,7 @@ runs 25 on purpose.
## Sources in play
`src/lib/references.ts` currently holds 24 entries, 20 of them cited by the five
`src/lib/references.ts` currently holds 24 entries, 21 of them cited by the 6
published sins. This table is a **convenience, not a scoreboard** — it's here so
you can spot a source that fits a sin you're drafting, not so we can drive the
right-hand column to zero blanks. An uncited reference is not a debt.
@@ -29,26 +29,26 @@ seven sources, give it seven and add whatever's missing to the file.
| --- | --- |
| `ftvisvocab` | — |
| `healy` | — |
| `munzner` | — |
| `schwabish` | — |
| `fewdualaxes` | dual-axis-correlation |
| `fewpies` | too-many-pie-slices |
| `huff` | truncated-y-axis |
| `isenberg2011` | dual-axis-correlation |
| `munzner` | incomplete-pie |
| `shapeparameter` | aspect-ratio |
| `showmenumbers` | too-many-pie-slices |
| `spurious` | dual-axis-correlation |
| `swd` | dual-axis-correlation |
| `tufte` | truncated-y-axis |
| `vizwtf` | inverted-y-axis |
| `callingbullshit` | inverted-y-axis, truncated-y-axis |
| `datatoviz` | dual-axis-correlation, too-many-pie-slices |
| `datawrapper` | dual-axis-correlation, too-many-pie-slices |
| `eagereyes` | aspect-ratio, too-many-pie-slices |
| `fewpies` | incomplete-pie, too-many-pie-slices |
| `junkcharts` | inverted-y-axis, too-many-pie-slices |
| `truthfulart` | aspect-ratio, dual-axis-correlation |
| `vizwtf` | incomplete-pie, inverted-y-axis |
| `wilke` | too-many-pie-slices, truncated-y-axis |
| `clevelandmcgill` | aspect-ratio, too-many-pie-slices, truncated-y-axis |
| `datatoviz` | dual-axis-correlation, incomplete-pie, too-many-pie-slices |
| `datawrapper` | dual-axis-correlation, incomplete-pie, too-many-pie-slices |
| `economistmistakes` | dual-axis-correlation, inverted-y-axis, truncated-y-axis |
| `howchartslie` | aspect-ratio, dual-axis-correlation, inverted-y-axis, truncated-y-axis |
@@ -74,7 +74,32 @@ we can build.
**Citations:** `huff` (the original con), `callingbullshit`, `howchartslie`,
`junkcharts`.
### 2. Pie Slices That Sum to More Than 100% — *Impossible Wholes*, severity 5
### 2. Results From a Hand-Picked Subgroup — *Deceptive Framing*, severity 4
**Poke:** "You didn't pick the wrong chart, you picked the wrong people. The
number is real; the group it describes was chosen after the fact."
The population-shaped twin of entry 1. Rather than trimming the time window, you
report the slice of the audience, region or segment where the number flatters —
often labelled honestly, which is what makes it feel above board.
The published `incomplete-pie` specimen is **also an example of this one**: it
reports the primary "in the countryside," excluding the capital, on a graphic
whose banner argues the capital can't win. Reuse the same image here with a note
about this failure mode — that's what the `wild` array is for, and it's the case
for keeping these as two pages rather than one.
Worth its own page rather than folding into entry 1: the tell is different (no
axis to inspect — you have to know what got left out), and the fix is different
(report the whole population, or every subgroup side by side, not just the
flattering one).
**Charts:** bad = one subgroup's result. Fixed = every subgroup plus the overall
figure, same underlying data.
**Citations:** `callingbullshit`, `howchartslie`, `huff`, `vizwtf`.
### 3. 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."
@@ -97,7 +122,7 @@ pie-chart post says "one pie chart can only show one total and its shares," and
it does *not* separately argue that parts must be mutually exclusive. Don't
stretch it further than that. Plus `datatoviz`, `junkcharts`.
### 3. A Pie Chart of Rates or Averages — *Impossible Wholes*, severity 5
### 4. 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."
@@ -120,7 +145,7 @@ same averages, plus the volume behind each one so the weighting is visible.
or it is nothing), `datawrapper` (same one-total premise as above), `schwabish`,
`ftvisvocab`.
### 4. Group Averages Shown Without the Distribution — *Hiding the Data*, severity 4
### 5. Group Averages Shown Without the Distribution — *Hiding the Data*, severity 4
**Poke:** "Four bars, four averages, and no idea whether the difference is real."
@@ -133,7 +158,7 @@ observations, means still marked.
**Citations:** `wilke`, `healy`, `schwabish`, `datatoviz`.
### 5. Bubbles Sized by Radius Instead of Area — *Perceptual Traps*, severity 4
### 6. Bubbles Sized by Radius Instead of Area — *Perceptual Traps*, severity 4
**Poke:** "You doubled the number and quadrupled the ink."
@@ -148,7 +173,7 @@ position does the work.
**Citations:** `munzner`, `clevelandmcgill`, `tufte`, `howchartslie`.
### 6. Stacked Segments Without a Shared Baseline — *Perceptual Traps*, severity 3
### 7. 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."
@@ -175,7 +200,7 @@ 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
### 8. 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."
@@ -210,6 +235,16 @@ rediscovering them:
too: the fixed chart needs a sequential ramp validated on `--chart-canvas` in
both themes. Don't draft this one until a real source is in hand.
## Two new levers, as of the first wild specimen
- **`wild`** — real examples, credited and linked, rendered above the citations.
Zero, one or many per sin. A specimen that commits two sins belongs on both
pages, with a different note on each; that's a reason to split sins, not merge
them.
- **`related`** — cross-links between sins, validated at build. Charts rarely
break one rule at a time, and the person you sent a link to may need the
neighbouring page more than the one they landed on.
## Conventions reminder
Note what the two pie entries above do and don't say. Neither condemns the pie