Presentation track, branch pr-chart-craft (Chart craft) · Node PR2.02 · ~12 focused hours · Mastery gate ≥ 85%
Count the visual elements on the funnel chart that opened a skincare brand's October review and you get one hundred. Eight of them carry a number. The other ninety-two are seven horizontal gridlines, nine vertical ones, eighteen tick marks, two axis lines, two axis titles and a label-style chart title. The rest are a legend frame with eight keys, eight hues that encode nothing, eight bevelled edges, eight drop shadows, sixteen data labels, a gradient background, a watermark, a plot border and a slide frame. The chart's actual finding, that 98.5% of the people who saw the advertisement never clicked it, appears nowhere in its title.
Rebuilt, the same eight numbers need twenty-nine elements. Seventy-one things went in the bin and no information left with them, because none of the seventy-one encoded a number in the first place. The data-bearing share of the slide moved from 8% of its elements to 27.6%, and the machine score on the seven slide rules went from 0.214 to 1.000.
Advertisement
You could call the difference taste. It's arithmetic, and the arithmetic is what follows. A gridline costs a measurable quantity of ink and returns a lookup you can test whether anyone needs. A legend costs two eye movements per series, so at six series it costs twelve. An eight-hue categorical palette costs colour-blind readers the ability to separate two of its hues at all, and the simulation that proves it is about twenty lines of Python. Every one of those is a number, and once you have the number the design argument stops being a matter of opinion.
The idea has a real limit, and it's worth stating early because it heads off the commonest overcorrection. Tufte's data-ink ratio, from The Visual Display of Quantitative Information in 1983, is a prompt to ask a question. It isn't a score to maximise. Bateman and colleagues, in a 2010 paper at the CHI conference titled "Useful Junk?", found that heavily embellished charts were recalled better after a two-week delay than plain ones. Their sample was small, and they measured recall, which isn't the same thing as reading accuracy. Push the ratio toward 1.0 and you end up with a chart with no labels, no reference line and no annotation, which is unreadable in a different way. The rebuilt funnel above actually spends new ink. It adds direct labels, a step-conversion column and a two-line annotation, and its data-ink ratio rises only from 0.605 to 0.665 even as its element count falls by 71%.
So what you want is a habit, and a slogan won't do. Delete anything that encodes nothing, then spend the attention you've recovered on the one thing you want seen. Both halves matter, and most decks fail the second one. An analyst strips a chart to a bare grey rectangle, feels pleased about the restraint, and leaves a reader with no idea which of the eight lines is the argument.
Colour is where the second half is won or lost, and it has a formula. One accent carries the message. Everything else recedes to a neutral. In most business charts that single rule replaces the whole categorical-palette question. It survives every form of colour blindness and works in a light theme and a dark one. It also gives you an emphasis ratio you can compute. An accent at a contrast of 4.63 to 1 against a page and a neutral at 1.65 to 1 gives the accent 2.81 times the contrast of its context. The accent's extra stroke width then multiplies the ink by three.
Everything that follows assumes the chart form is already correct. Choosing between a bar, a line, a scatter and a slope chart was the job of the previous lesson, and going over it again here would waste your time. The two meet in one place, the redraw decision, near the end. When a chart is the wrong form, decluttering it is the wrong repair. Knowing which of the two problems you've got is worth more than any single rule below.
Learning objectives
You can:
- Compute an element census and a data-ink ratio for a chart before and after a rebuild, and state precisely what each figure does and does not prove.
- Apply the eight-step delete order in sequence, naming what each step removes, what share of the non-data ink it recovers, and what information it costs.
- Price a decoration in attention: state what a gridline, a border, a shadow, a gradient fill and a legend each cost, and compute which of them are visible at the back of a room.
- Rank the pre-attentive attributes by decoding accuracy, and choose the encoding that carries your message at the viewing distance your audience actually sits at.
- Apply the accent-plus-neutral formula to a chart of any number of series, and compute the emphasis ratio and the ink share it produces.
- Choose between categorical, sequential and diverging palettes from the data type alone, and anchor a diverging scale where the data's meaning sits rather than at its mean.
- Check contrast against the accessibility minimum in a light and a dark theme, and show why one accent value usually cannot serve both.
- Test a palette for colour-blind safety by dichromat simulation and by the grey-scale test, and name the two encodings that make the hue question irrelevant.
- Replace a legend with direct labels, computing the chart-choice table cost the legend was imposing and the cases where a legend is still the right answer.
- Decide between tidying a chart and redrawing it, and write the one-sentence annotation that carries the argument once the redraw is done.
Prerequisites & connections
Builds on. PR2.01, which taught you to pick the form from the message: bar for comparison across categories, line for change over ordered time, scatter for relationship, stacked bar for part-to-whole across few categories, slope chart for change between exactly two periods, small multiples wherever a dual axis was tempting. Everything below assumes that decision is already made and correct. From the mechanics branch, PR1.02's grid and type scale are assumed and not retaught, and PR1.03's object mechanics are what you'll use to carry out a rebuild.
Feeds forward. PR2.03 takes a decluttered chart and gives it the action title, the single focal point, the small-multiple grid and the dashboard reading order, and it is the crown of this branch at a 0.90 gate. PR3.01 applies the same pre-attentive vocabulary to diagrams instead of data. PR4.02 carries titles across a whole deck. The archetype nodes, PR5.01 to PR5.03, assume every exhibit in a consulting deck, a board pack or a research deck already passes the colour and declutter rules, and PR7.01 grades them at the capstone standard.
Six neighbours own material that borders this one, and none of it is rebuilt here. PR2.01 owns chart-form choice in full, including the permanent fails, the axis-baseline honesty rule and the sorting-as-argument idea. Where a rebuild below changes a form, it names the rule and moves on. PR2.03 owns the action title, the focal point, small multiples and dashboards. Titles appear below only as a given, because you can't declutter a chart toward a message nobody has written yet. PR1.02 owns alignment, distribution, grids, guides and the type scale, including the projection-distance argument for type size. PR1.03 owns objects, animation, export and the shipping checklist, including alt text and reading order as build habits. M10.03 owns exhibit design inside written deliverables, where a reader controls their own pace and a dense exhibit is legitimate. DA1.04 owns exploratory plotting in code, where the audience is you and the rules below are deliberately suspended.
Core teaching content
1. Data ink, and the ratio that is a question rather than a score
Tufte's definition is simple enough to apply by hand. Take the ink used to print a graphic, split it into the ink that encodes data and the ink that does not, and form the ratio. Erase anything on the wrong side of the split.
Try it on the Nilaya Skincare funnel. The plot area is 760 by 420 pixels, and by convention you leave the page background out. Non-data ink totals 108,696 square pixels. That's 51,840 in bevels and drop shadows, 13,200 in the watermark, 9,100 in gridlines, 10,016 in the legend, 9,152 in duplicate data labels, and the rest in frames, ticks, axis lines and two titles. Data ink, the eight funnel segments themselves, totals 166,400. The ratio is 0.605.
The rebuild deletes every element in that non-data list, redraws the eight stages as horizontal bars, and adds direct labels, a step-conversion figure per stage and a two-line annotation. Non-data ink falls to 41,008 and data ink falls to 81,260, because the bars are thinner than the funnel segments they replace. The ratio rises to 0.665.
So a 0.06 gain isn't what makes the second chart better. If you'd optimised for the ratio, you'd have deleted the labels and the annotation and made it worse. The census tells you more. It went from 100 elements to 29, and the data-bearing share tripled from 0.080 to 0.276. Ninety-two elements were competing with eight for the reader's attention. Now twenty-one are supporting them.
Treat the ratio as a diagnostic question. Point at each element and ask what number it encodes. If the answer is none, ask what lookup it enables and who does that lookup. If neither question has an answer, the element is decoration and it goes. That's the whole procedure. It takes about four minutes on a chart you built yourself and about eight on somebody else's.
It comes with two limits. The ratio has no opinion about whether the chart is the right form, so a beautifully decluttered pie chart of eight slices is still wrong. Nor does it care whether the message is true. It also treats every square pixel as equal, and they aren't. A watermark at 20% opacity behind the plot costs less attention than the same area of hard black rule crossing it. Where the two disagree, trust the census over the area.
2. The eight things to delete, in order
Why does the order matter? The first deletions are free, since nothing on the chart depends on them. They also clear enough visual noise that you can see what the remaining decisions actually are. Analysts who start at the other end spend twice as long and stop too early. They agonise over whether to keep a legend while the drop shadows are still there.
Run these in sequence on the Nilaya before-slide and here's how much of its 108,696 square pixels of non-data ink you get back at each step.
| # | Delete | Ink recovered | Cumulative | Cumulative share |
|---|---|---|---|---|
| 1 | Fake dimension: bevels, 3-D edges, drop shadows | 51,840 | 51,840 | 47.69% |
| 2 | Backgrounds and watermarks behind the plot | 13,200 | 65,040 | 59.84% |
| 3 | Borders and frames: plot border, slide frame, legend frame | 5,820 | 70,860 | 65.19% |
| 4 | Gridlines beyond the few a lookup needs | 9,100 | 79,960 | 73.56% |
| 5 | Tick marks and axis lines a labelled scale repeats | 1,288 | 81,248 | 74.75% |
| 6 | Duplicate data labels: value and percentage on every mark | 9,152 | 90,400 | 83.17% |
| 7 | The legend, replaced by direct labels | 10,016 | 100,416 | 92.38% |
| 8 | Axis titles, and the label-style title the action title replaces | 8,280 | 108,696 | 100.00% |
The first three steps recover 65.19% of the non-data ink and cost nothing at all. A bevel, a shadow, a watermark and a border encode no number under any reading. That's free money, and it's why the order starts there.
Steps four to six are where judgement comes in. A gridline isn't decoration if a reader has to read a value off the axis, so the test is whether anyone will. On a chart whose message is a shape, nobody reads values, and every gridline is noise. On a chart that'll be printed and referred to across a meeting, three or four horizontal gridlines at round intervals are worth keeping. Tick marks almost never are, because a labelled axis already marks its own positions. Data labels on every point are the commonest single overcorrection. They go on to satisfy a reader who might want a value, and they turn the chart into a table with a line drawn through it.
Step seven gets its own section below. The legend is the most expensive element on most business charts, and the case for deleting it is a measurement.
Step eight is a swap. An axis title reading "Stage" above a column of stage names is pure repetition and goes. A chart title reading "Funnel Performance" is a filing label, and it goes too. What replaces it is a sentence carrying the finding, which costs more ink than the label did. That's the second half of the habit at work.
One warning about the order. Deleting is addictive, and if you keep going you end up with a chart so bare that a reader can't get their bearings. The stopping rule is a question. Can a reader who has never seen this data say what the chart is measuring, over what period, in what units, and which mark is the point? If any of those four answers is missing, you've deleted one step too many. Put back the cheapest element that restores it.
Chartjunk
Chartjunk is decoration on a chart that carries no data, such as a drop shadow or a 3-D effect. Every decoration has two costs: the ink it uses and, more importantly, the attention it takes from the marks that matter. Some of it can't even be seen from the back of the room: on a three-metre screen, a one-pixel gridline falls below the eye's acuity limit at eight metres.
4 min read, on its own page
Pre-attentive attributes
Some visual properties are processed before attention arrives. A single red dot among fifty grey ones is found in about the same time whether there are fifty distractors or five hundred, because the search does not scan. Encode the quantity with position or length. Encode the emphasis with luminance, supported by hue. Never encode anything that matters with shape, orientation or area, and never with hue alone.
4 min read, on its own page
5. The colour formula: one accent, everything else neutral
Most business charts need two colours. One accent carries the message. One neutral carries everything the message needs for context. A third colour has to justify itself by encoding something the first two can't, and on the great majority of slides there's nothing like that.
The formula solves four problems at once, so learn it as your default and not as one option among many. It makes the focal point unambiguous, because there's only one saturated mark in the field. It survives colour blindness, because the accent and the neutral differ in lightness and not only in hue. It survives greyscale printing for the same reason. And it removes the categorical-palette decision entirely, which is the decision that produces rainbow charts.
Here's the working pair used throughout the examples below. The arithmetic is what makes them a pair. They aren't just two colours somebody liked.
| Role | Light theme | Relative luminance | Contrast on white |
|---|---|---|---|
| Body ink | #16233A | 0.016781 | 15.72 : 1 |
| Accent | #1F6FEB | 0.176583 | 4.63 : 1 |
| Neutral context | #C4CAD2 | 0.586300 | 1.65 : 1 |
The accent is at 4.63 to 1 against the page and the neutral at 1.65 to 1, so the accent carries 2.81 times the contrast of its context. Draw the accent series at three pixels and the context at one and the accent carries three times the stroke ink as well. Those two multipliers compound. Between them, they're the whole mechanism behind the phrase "greying out". Grey a set of context lines from body ink to the neutral and their contrast against the page changes by a factor of 9.53. After that, the accent has nothing to compete with.
Ink share gives you a second way to see it. Take a chart with one accent line at three pixels and eight context lines at one pixel over paths of equal length. The accent carries 27.27% of all the line ink on the plot. Add four more context series and the accent's share falls to 20.00%. So the formula degrades gracefully instead of breaking. A hue-per-series palette can't say the same.
Three rules govern where the accent goes.
The accent marks the subject of the sentence in the title. If the title says the April to June cohorts retain eleven points better, the April to June cohorts are the accent and the January to March cohorts are neutral. If the title changes, the accent moves. A chart where the accent and the title disagree is worse than a chart with no accent at all. The reader trusts the colour and reads the wrong thing.
A second accent is allowed only when the message is itself a comparison of two named things. Even then, the two accents must be separable in lightness as well as in hue. Two saturated colours of similar lightness, the classic red-and-green pair, fail for the eight percent of men with a red-green deficiency and fail for everyone in greyscale.
Keep the neutral neutral. Don't use a desaturated version of the accent. A pale blue reads as a weak member of the accent's family, and you want background. Pick a grey with a slight temperature and use the same one everywhere.
Two cases fall outside the formula, and both are worth naming. If the message is the composition of a whole across categories, the categories have to be distinguishable, so a small categorical palette applies. If the message is a value gradient over a continuous quantity, you need a sequential or diverging ramp. That's the next section.
Sequential vs diverging colour palette
A sequential palette encodes an ordered quantity running from a meaningful low to a meaningful high, such as a count, a rate or an intensity. It runs light to dark in a single hue, or across two neighbouring hues, and the darkness carries the magnitude. It has no midpoint. The error is using one where the data has a natural midpoint. A diverging palette encodes an ordered quantity with a meaningful centre: growth against zero, performance against a target, a variance against budget.
4 min read, on its own page
WCAG contrast ratio
The Web Content Accessibility Guidelines set two numbers that matter for charts. Normal-size text needs a contrast ratio of at least 4.5 to 1 against its background. Graphical objects that convey information, which covers a bar, a line, a marker and a reference rule, need at least 3 to 1. Contrast ratio comes from relative luminance. How different two colours look doesn't enter into it.
4 min read, on its own page
Colour-blind friendly chart colours
Colour-blind friendly chart colours are colours that a reader with a colour vision deficiency can still tell apart. About 8% of men of northern European descent and about 0.5% of women have one, so in a room of thirty people one or two readers may not be able to separate your hues. Separating colours by lightness as well as hue, or labelling the series directly, keeps a chart readable for them.
4 min read, on its own page
Direct labelling in charts
Direct labelling means naming each series on the chart itself, usually at the end of its line, instead of in a legend. A legend makes the reader hold a colour in memory and look across to the plot and back, which is two round trips of the eye per series for each question. At six series, assuming 250 milliseconds a trip, that is 3 seconds spent before the reader starts thinking about the data.
3 min read, on its own page
Chart annotation
A decluttered chart is quiet. That's what you built it for, and it's also its weak spot, because a quiet chart lets a reader arrive at a reading you didn't intend. The fix is an annotation. It's a short sentence placed on the plot, next to the mark it explains, in the accent's colour or in body ink. An annotation says what to see.
3 min read, on its own page
11. Emphasis without shouting
Emphasis is a relationship between one mark and its context. So every technique for creating it works by changing the context, and leaves the mark alone. That inversion is the most useful idea in this part. It explains why the instinct to make the important thing bigger, redder and bolder usually fails. It raises the accent's absolute salience and leaves the competition intact.
Here are four moves, in order of how often they're the right one.
Grey the context. Take every series that isn't the subject to the neutral. On the retention chart, this alone takes your eye to the accent without any change to the accent. Measured, it changes the context lines' contrast against the page from 15.72 to 1 down to 1.65 to 1, a factor of 9.53.
Thin the context. Context at one pixel and accent at three gives the accent three times the stroke ink. Combine that with greying and the two multipliers compound. On a chart with eight context series, the accent still carries 27.27% of the total line ink, though it's only one of nine.
Label only the accent. Direct labels on every series turn the label layer into its own clutter. Label the accent and the two series a reader will ask about. Then identify the rest with a single quiet note that says what they are.
Enclose, as a last resort. A light-toned rectangle behind a region of the plot is a pre-attentive enclosure cue, and it works. But it competes with the plot's own structure, and it's easy to overuse. Save it for marking a time window or a cluster, and never draw it with a border when a fill will do.
The list of things to avoid is shorter. Don't use red for emphasis unless the message is negative. Red carries a meaning of its own in every financial context, and a reader will see a loss in a red bar that's simply the one you wanted them to look at. Don't put bold text, a bigger size and a different colour on the same label. Three changes read as three separate signals, and the reader goes looking for three different meanings. And don't emphasise more than one thing per chart. A slide with two focal points has none. If the message really has two parts, it's two charts.
The commonest failure here is emphasis with no message behind it. An analyst highlights the largest bar because it's the largest. The chart then asserts that size is what matters, and that may not be the finding at all. On the Suryagarh channel data the largest channel is modern trade at 22.4%. The finding, though, is that the top three are within 1.8 points of each other. So the emphasis belongs on the three of them together. The winner alone is the wrong mark to light up.
12. The redraw discipline: tidy or rebuild
You can't fix some charts by deleting things. A chart in the wrong form is one of them, and so is a chart built for a message that has since changed. Try to tidy either and you'll lose an hour and end up with a cleaner version of the wrong thing.
The test takes one question. Delete every non-data element from the chart in your head, leaving only the marks and a labelled axis. Does the stripped chart show the message? If yes, the chart is cluttered, and the delete order will fix it. If no, the chart is wrong, and it needs a redraw.
Suryagarh Ceramics' channel mix runs the test. The chart is a pie of eight slices with a legend, a data-label ring and a bevel on each slice. Strip it and you have eight bare wedges. The message is that the top three channels are within 1.8 points of each other, which as arc is 6.48 degrees out of 360, and the top two differ by 3.24 degrees. The stripped pie doesn't show it and can't be made to. Redraw.
As a sorted bar on a 640-pixel axis, the same 1.8 points is 51.43 pixels of length difference. The 0.9 points between the top two is 25.71 pixels. The numbers are identical in both charts. What moved is the encoding, from angle to length. Those are the two members of Cleveland and McGill's third rank that their experiments separated in that order. And the reader can now see the comparison the chart exists to make.
Four symptoms tell you to redraw, and each one has a specific rebuild.
A pie with more than three slices, or any pie whose message is a comparison between slices, becomes a sorted bar. The four slices under 10% on the Suryagarh chart hold 20.7% of revenue between them and are individually unreadable as arcs.
A chart with two vertical axes becomes either two indexed series on one axis or a pair of small multiples with a shared time axis. No amount of decluttering lets a reader see that someone chose the right-hand scale. To them it looks given.
A line chart of more than about five series becomes a small-multiple grid, or an accent-and-context chart if the message is about one of them. Greying seven of eight lines is the cheaper fix, and it works whenever the message names one series.
If a chart's title is a noun phrase, nobody has yet shown it has a message. Write the sentence first. If the sentence is about a different comparison from the one the chart draws, the chart is wrong and no cleaning will help.
The redraw is usually faster, too. Rebuilding the Suryagarh pie as a sorted bar from the underlying table takes about six minutes. Fighting a chart object's inherited formatting to remove eight bevels, a ring of labels and a legend takes longer, and the form is still wrong at the end of it.
13. Before and after, measured
Two of the seven machine rules are the declutter rule and the colour-discipline rule. Both are written so that a person and a script agree on the score. Each rule is worth 0, 0.5 or 1, and the machine score is their mean across the seven. The composite is 0.6 of the machine score plus 0.4 of a rubric self-score you commit before you see the machine's result.
Declutter scores 1 when every element on the chart passes one of two tests. Either it encodes a number, or it enables a lookup a stated reader will actually perform. It scores 0.5 when one or two elements fail. It scores 0 when three or more fail, or when any of the four automatic failures is present: a three-dimensional effect on a two-dimensional quantity, a bevel or drop shadow on a data mark, a gradient fill inside a data mark, or a background image behind the plot.
Colour discipline scores 1 when four conditions hold together. The palette is either accent-plus-neutral or a correctly typed sequential or diverging ramp. The accent marks the subject of the title. Every information-carrying mark clears 3 to 1 against its background, in the theme the deck will be shown in. And the closest pair in the palette stays above a perceptual distance of 20 under deuteranope simulation. One failure scores 0.5. Two or more, or any categorical palette above five hues, scores 0.
Run the makeovers below through all seven and here are the composites.
| Chart | Machine | Rubric | Composite | Verdict at 0.80 |
|---|---|---|---|---|
| Nilaya funnel, before | 0.2143 | 0.30 | 0.2486 | fail |
| Nilaya funnel, after | 1.0000 | 0.95 | 0.9800 | pass |
| Ridgeline retention, before | 0.3571 | 0.35 | 0.3543 | fail |
| Ridgeline retention, after | 0.9286 | 0.90 | 0.9171 | pass |
| Suryagarh channel pie, before | 0.3571 | 0.25 | 0.3143 | fail |
| Suryagarh channel bar, after | 1.0000 | 0.90 | 0.9600 | pass |
The Nilaya gain is 0.7314 composite points and the Ridgeline gain is 0.5629. Why the gap? The funnel was rebuilt to a perfect machine score because every one of its failures was mechanical. The retention rebuild scores 0.9286, short of 1.0000, because its hierarchy rule is at 0.5. A six-panel grid has no single focal point by construction, so the panel order has to direct the reader's eye, and contrast can't. That's a real cost of the small-multiple form. It's still the right trade for this message. Record it as a half, and don't argue the score up.
Two habits make the measurement worth having. Commit the rubric self-score before you look at the machine's, because a self-score written afterwards is a rationalisation. And record the before-score as well as the after. The gain tells you which rule you're personally weakest on. Across ten makeovers, the pattern in your own before-scores is more useful than any single result.
14. Where the assistants help, and where they mislead
An assistant is good at three things here and unreliable at three others. One principle explains the split. It can see the description of a chart, and it can't see the chart.
It's really useful for the element census. Describe a chart element by element, ask for the list sorted into encodes-a-number and encodes-nothing, and you'll get a workable first pass in seconds. It's useful for palette arithmetic, because contrast ratios, dichromat simulation and perceptual distance are code. Asking for the script is faster than looking up the transform. And it's useful for annotation drafting. Give it the numbers, ask for six candidate sentences under twelve words, then choose.
It misleads in three specific ways. It'll assert that a palette is colour-blind safe without computing anything. "Use a colour-blind-safe palette" turns up in its training data far more often than a simulation result does. It'll confuse deleting with improving, and recommend stripping the annotation and the reference line along with the gridlines, because the data-ink slogan is more famous than its limits. And it'll describe an after-slide it hasn't seen as though the rebuild were already done. That reads like verification, and it isn't.
One rule covers all three. An assistant may compute, and it may not certify. A contrast ratio it prints is checkable, so use it. A verdict it offers on a chart it can't see isn't evidence of anything.
{
"skill": "Auditing a chart's clutter and colour with computed evidence rather than an aesthetic opinion",
"use": "After you have written your own element census by hand and named your accent, hand the assistant the census and the hex codes and ask it to produce a runnable script that computes the data-ink ratio, every WCAG contrast ratio in both themes, and the closest CIE76 pair under deuteranope, protanope and tritanope simulation. Run the script yourself. Use its numbers to accept or reject your palette; never accept its verdict without the numbers.",
"tools": ["Chat assistants (Claude, ChatGPT, Gemini)", "Python with no libraries beyond the standard library", "A colour-blindness simulator such as Coblis or the simulation built into your design tool"],
"prompt": "Here is a chart's element census, one line per element with a count: <CENSUS>. Here are the hex colours in use: <HEXES>. Here is the light-theme and dark-theme background: <BG_LIGHT>, <BG_DARK>. Write me a single Python script, standard library only, that prints: (1) each element classified as encodes-a-number or encodes-nothing, with a total for each; (2) the WCAG 2.x contrast ratio of every colour against both backgrounds, with pass or fail at 4.5 for text and 3.0 for non-text; (3) the CIE76 distance of every colour pair under normal vision and under Vienot-Brettel-Mollon deuteranope, protanope and tritanope simulation, sorted ascending, flagging any pair below 20. Do not tell me whether the chart is good. Print numbers only.",
"verify": "Run the script and read its output; a claim the assistant makes in prose that the script does not print is not evidence. Check the contrast function against one hand-computed case: relative luminance of #FFFFFF is 1.0 and of #000000 is 0.0, so their ratio must print as exactly 21.0, and if it does not the sRGB linearisation is wrong and every other number is too. Then confirm the classification by hand for the three elements you are least sure about, because the assistant will classify a reference line as decoration and a gradient as a data mark if the census wording invites it. Finally, look at the chart yourself in a greyscale conversion: if two series that the script says are separable are not separable to your eye, trust your eye and find the bug.",
"diy": "You must be able to run the eight-step delete order, choose between categorical, sequential and diverging from the data type, and decide accent against neutral, on paper, with no tool and no assistant. The gate rewards that because the decision is taken in the four minutes between finishing an analysis and building its exhibit, usually with somebody waiting, and an analyst who can only audit a chart after the fact will keep building charts that need auditing.",
"market": "IN"
}
Common mistakes & how experts think differently
- Optimising the ratio instead of using it. Tufte's ratio is a question. Treat it as a score and you get charts with no labels, no reference line and no annotation. The rebuilt funnel below spends new ink on purpose, and its ratio moves only from 0.605 to 0.665 while its element count falls 71%. An expert deletes what encodes nothing, then spends the attention that frees up, and reports both halves.
- Decluttering a chart that is in the wrong form. The stripped-chart test settles it in ten seconds. Remove every non-data element in your head and ask whether the message is visible. Eight bare pie wedges can't show a 1.8-point difference, so no amount of cleaning helps. Novices tidy because tidying feels productive. Experts redraw, and the redraw is usually faster.
- Adding a highlight without removing the competition. Emphasis is a contrast between a mark and its field, so a red bar among seven coloured bars isn't emphasised at all. The expert changes the context instead. Grey it, thin it, take its labels off. Greying context lines from body ink to the neutral changes their contrast against the page by a factor of 9.53, and nobody has touched the accent.
- Trusting hue to carry a distinction. Under deuteranope simulation the default red and green in an eight-hue palette collapse from a perceptual distance of 129.86 to 9.21. In greyscale, three of the eight hues fall inside a luminance band of 0.114. Experts encode with position or length and treat hue as a redundant second channel. That's what lets the chart survive a bad projector as well as a colour-blind reader.
- Anchoring a diverging scale at the data's mean. Software offers it, and it's wrong wherever the centre has a meaning. On the Fairmount territories, anchoring at the mean of −1.125% colours a territory that shrank 0.8% as growth. An expert states the centre before choosing the palette. It's zero, or the target, or the benchmark, and never the average of the sample.
- Keeping the legend because deleting it feels risky. At six series a legend costs twelve fixation round trips, about three seconds, before any thinking starts. Experts direct-label by default. They keep a legend only for a continuous colour scale, a shared scale across a small-multiple grid, or lines that converge where the labels would go.
- Reading a contrast check as a compliance chore. The 4.5 to 1 and 3 to 1 thresholds stand in for the back row, the washed-out projector and the phone in sunlight. An accent that passes at 4.63 to 1 on white falls to 3.99 to 1 on a dark background. The dark-theme version of the same accent fails outright on white, at 2.41 to 1. Experts carry two accent values and check in the theme the deck will actually be shown in.
- Labelling every point because a reader might want a value. Sixteen data labels on eight marks were 8.4% of the Nilaya chart's non-data ink, and they turned a shape into a table. The expert asks which values a reader will quote and labels those. The full series goes in an appendix table, where precision belongs.
- Deleting past the point of orientation. The stopping rule is four questions: what is measured, over what period, in what units, and which mark is the point. Someone who has just discovered decluttering will remove the axis labels and the units. The chart that's left is minimal and unreadable. Put back the cheapest element that restores the missing answer.
- Treating the machine score as the verdict. A chart can score 1.000 on all seven rules and still assert something false. That's why the composite puts 40% on a rubric self-score committed before you see the machine's result. Whether the exhibit was worth building is a question no rule can check.
Worked examples
Every figure below comes from one computation, and the Verify block at the end of the section restates each at full precision. All the companies are synthetic composites. The before-slide and the after-slide of every makeover use identical data, so any difference you see comes from the design. The data is the same.
Worked example 1: An eight-hue funnel rebuilt to one accent (India, ₹)
The setting. Nilaya Skincare (synthetic) sells direct to consumers. Its October performance review opens with a funnel chart built from the advertising platform's own export, in the platform's default styling.
The message the analyst wants to make. The funnel loses almost everything at the first step, and the second-worst step is nowhere near it. So the October optimisation work should go into creative and targeting. The checkout can wait.
The data. Every stage count for October, with the step conversion each one implies.
| Stage | Count | Step conversion | Drop | Share of impressions |
|---|---|---|---|---|
| Ad impressions | 12,400,000 | 100.0000% | ||
| Ad clicks | 186,000 | 1.5000% | 98.5000% | 1.500000% |
| Site sessions | 152,520 | 82.0000% | 18.0000% | 1.230000% |
| Product page views | 61,008 | 40.0000% | 60.0000% | 0.492000% |
| Add to cart | 15,252 | 25.0000% | 75.0000% | 0.123000% |
| Checkout started | 8,388 | 54.9961% | 45.0039% | 0.067645% |
| Payment success | 5,871 | 69.9928% | 30.0072% | 0.047347% |
| Delivered and kept | 4,873 | 83.0012% | 16.9988% | 0.039298% |
At an average order value of ₹1,450 the kept orders are worth ₹70,65,850, or ₹0.7066 crore for the month. One impression in 2,545 becomes a kept order.
The wrong version. A three-dimensional funnel object, eight segments in eight hues from the platform's default palette, each with a bevelled edge and a drop shadow, a value label and a percentage label. A legend down the right side repeats the eight stage names. Seven horizontal and nine vertical gridlines cross the plot, and eighteen tick marks run along two axis lines. Two axis titles read "Stage" and "Users". A watermark of the brand logo at 15% opacity is behind everything, and the title reads "Funnel Performance, October". The census comes to 100 elements, of which eight carry a number.
Three things are wrong with it beyond the count. The bevels and shadows put a soft second edge on every segment, and that's the edge a reader uses to judge size. The eight hues invite a reader to look for meaning in the colours. There isn't any, because position already orders the stages. And the title commits to nothing, so the reader has to dig out the finding themselves, from a chart whose encoding actively hides it. On a funnel object, the first segment's 12,400,000 and the second's 186,000 are drawn at similar widths. The shape tapers by design. The data has nothing to do with it.
The corrected version. A horizontal bar chart, eight bars, sorted in funnel order because the order is intrinsic. Bar length is proportional to count on a linear scale, so the first bar runs the full 640 pixels of the plot, the second runs 9.6 and the last runs a quarter of a pixel. You can see the collapse at the first step, so nobody has to assert it. The scale can't separate the lengths of the other seven stages, so you read those from their step-conversion labels. That's the split this message needs. Length carries the headline and the labels carry the rates. Every bar is in the neutral except the first-to-second transition, which is the accent. Each bar carries its stage name at the left and its step-conversion percentage at the right, both as direct labels, so there's no legend. A single baseline rule anchors the bars. One annotation goes beside the second bar.
Here's the layout in detail. The action title runs across the top on two lines. It states that 98.5% of impressions never become a click and that the next-worst step loses 75%. Below it the eight bars stack with 34 pixels of height and 12 pixels of gap. Stage names go in a left column of 120 pixels, right-aligned. Step conversions go immediately to the right of each bar's end, in body ink at 12 point. The annotation reads: "The click step loses 12.2 million of 12.4 million. Every other step together loses 181,000." A footnote gives the month, the source system and the average order value.
| Before | After | |
|---|---|---|
| Elements | 100 | 29 |
| Data-bearing elements | 8 | 8 |
| Data-bearing share | 0.0800 | 0.2759 |
| Non-data ink, px² | 108,696 | 41,008 |
| Data ink, px² | 166,400 | 81,260 |
| Data-ink ratio | 0.6049 | 0.6646 |
| Machine score | 0.2143 | 1.0000 |
| Rubric self-score | 0.30 | 0.95 |
| Composite | 0.2486 | 0.9800 |
Read it. Seventy-one elements went and the data-ink ratio moved only 0.0597. The rebuild spent new ink on twenty-one supporting elements it didn't have before. The composite gain of 0.7314 is the number that matters. Most of it came from three rules that were at zero: one-message, title-is-the-message and colour-discipline. What the chart still can't tell you is whether 1.5% is a bad click-through rate for this category. No amount of design will answer that. The chart has a right to the recommendation only if you also carry the benchmark, and that belongs in the appendix.
The arithmetic that makes the recommendation. Take a half-point improvement at the click step, from 1.5% to 2.0%. It scales every downstream stage by 1.3333 and takes monthly revenue from ₹0.7066 crore to ₹0.9421 crore, an uplift of ₹0.2355 crore. Apply the same half-point at the cart step, from 25.0% to 25.5%, and it scales downstream by 1.0200. That's worth ₹0.0141 crore. The click step is worth 16.7 times as much for the same effort, and that's the sentence the title should carry.
The checklist to apply.
- Census the elements and split them into encodes-a-number and encodes-nothing.
- Run the eight-step delete order in sequence, whatever your preference.
- Name the subject of the title and make that the accent. Everything else goes neutral.
- Replace the legend with direct labels and count the round trips saved.
- Check that the form still fits the message after the cleaning. A funnel object was never a length encoding.
- Write the annotation that says what the chart can't show.
- Record the before composite as well as the after.
Worked example 2: A cohort chart that needed six panels, not six colours (US, $)
The setting. Ridgeline Ops (synthetic) sells seat-based software. The head of customer success wants to show the board that the onboarding change shipped at the end of March worked.
The message. Cohorts that started after the onboarding change retain about eleven points better at month twelve than the cohorts before it, and the gap is visible by month six.
The data. Logo retention by month since start, for the six monthly cohorts of the first half of 2024, in percent.
| Cohort | M0 | M3 | M6 | M9 | M12 | Seats started |
|---|---|---|---|---|---|---|
| Jan 2024 | 100.00 | 72.42 | 64.60 | 62.38 | 61.75 | 412 |
| Feb 2024 | 100.00 | 73.35 | 65.79 | 63.65 | 63.04 | 448 |
| Mar 2024 | 100.00 | 71.85 | 63.86 | 61.60 | 60.95 | 396 |
| Apr 2024 | 100.00 | 79.37 | 73.52 | 71.86 | 71.39 | 501 |
| May 2024 | 100.00 | 80.59 | 75.08 | 73.52 | 73.08 | 537 |
| Jun 2024 | 100.00 | 81.45 | 76.18 | 74.69 | 74.27 | 522 |
The January to March mean at month twelve is 61.9148% and the April to June mean is 72.9099%, a difference of 10.9950 points. At month six the same comparison gives 64.7510% against 74.9272%, a difference of 10.1762 points. So the month-twelve gap is 1.0805 times the month-six gap, and the story was already visible half a year earlier.
Now weight by seats instead of by cohort. 1,256 seats started in the first three months and 778.21 were retained at month twelve, which is 61.9593%. 1,560 started in the second three and 1,137.74 were retained, which is 72.9320%. The weighted difference of 10.9726 points is within 0.023 points of the unweighted one. That's your cross-check. The cohorts are similar enough in size that the simple mean doesn't mislead. At $148 per seat per month, the extra retained seats in the later cohorts are worth $25,333.57 of monthly recurring revenue.
The wrong version. One line chart, six series in six hues from the default palette. A legend below the plot lists the cohorts alphabetically. There are eleven horizontal gridlines at ten-point intervals from 0 to 100, a plot border, markers on all seventy-eight points, and the title "Logo Retention by Cohort". Two of the six hues, the red and the green, are at a perceptual distance of 9.21 under deuteranope simulation. The y-axis runs from 0 to 100, so the entire eleven-point story takes up about a tenth of the plot height.
The corrected version. A small-multiple grid, two rows of three panels. Each panel is 300 by 170 pixels with 24-pixel gutters, giving a block 948 pixels wide and 364 tall. Every panel plots the same six curves. In each panel one curve is the accent at three pixels and the other five are the neutral at one pixel, so each panel says "here is this cohort against its peers". The panels run in order of start month, left to right and top to bottom, which is the intrinsic order. The y-axis runs 0 to 100 and is drawn once, on the left of each row. The x-axis is labelled once, on the bottom row.
Colour now carries nothing. The accent is the same blue in every panel. Position tells you which cohort you're looking at, and hue plays no part. So the chart passes the colour-blind test without anyone testing it. There are 432 line segments drawn in two colours, and nothing to confuse.
Direct labels replace the legend entirely. Each panel carries its cohort name as its own small heading, and the month-twelve value of the accent curve is labelled at the right-hand end of that curve. A single reference line at the January to March mean of 61.9% runs across all six panels. That line is what makes the three later panels read as clearly above it.
| Before | After | |
|---|---|---|
| Series in one plot | 6 | 1 accent + 5 context, per panel |
| Distinct hues | 6 | 2 |
| Legend round trips for "which cohort retains best" | 12 | 0 |
| Lookup time at 250 ms per cycle | 3.00 s | 0 s |
| Closest palette pair, deuteranope | 9.21 | 82.93 |
| Machine score | 0.3571 | 0.9286 |
| Composite | 0.3543 | 0.9171 |
Read it. The after-slide scores 0.9286, short of 1.0000, because its hierarchy rule is at a half. A six-panel grid has no single focal point by construction. Panel order directs the reader's eye, and contrast doesn't. That's a real cost of the form. It's still the right trade here, because the message compares two groups of three and no single panel carries it. Don't argue the score up. Record the half and say why in the notes.
There's one thing the chart can't tell the board. Did the onboarding change cause the improvement, or were the April to June cohorts simply better customers? The chart shows a coincidence in time on six cohorts. A truthful title says the cohorts after the change retain eleven points better. If you make the causal claim at all, make it in words, with the evidence that supports it.
The checklist to apply.
- Count the series. Above five, small multiples are the default and a single plot is the exception.
- Ask whether hue is carrying anything position could carry instead.
- Compute the legend's round-trip cost before deciding to keep it.
- Fix a shared scale across every panel and say so in the footnote.
- Add the one reference line that makes the comparison readable.
- Score the hierarchy rule as it is. A grid usually costs half a point there.
- Separate what the chart shows from what the analyst is claiming.
Worked example 3: The accent that passed on white and failed on black (India, ₹)
The setting. Nilaya's house palette was chosen against a white slide master. The October review is presented in a room whose projector is set to a dark theme, and the deck's template inverts automatically.
The message. One accent value cannot serve both themes, and the failure is invisible on the machine that authored the deck.
The data. Relative luminance and contrast ratios, computed from the sRGB definition, with the 4.5 to 1 text threshold and the 3 to 1 non-text threshold applied.
| Colour | Role | Luminance | On white | On night #101418 |
|---|---|---|---|---|
#16233A | body ink | 0.016781 | 15.7230 : 1 | |
#E6E9EE | dark-theme text | 0.812739 | 15.1986 : 1 | |
#1F6FEB | accent, light theme | 0.176583 | 4.6341 : 1 | 3.9917 : 1 |
#6FA8FF | accent, dark theme | 0.386048 | 2.4080 : 1 | 7.6817 : 1 |
#C4CAD2 | neutral context, light theme | 0.586300 | 1.6502 : 1 | |
#3C4450 | neutral context, dark theme | 0.056741 | 1.8804 : 1 |
The wrong version. One accent, #1F6FEB, used in both themes because the brand guideline names one blue. On white it's comfortable at 4.6341 to 1. On the dark theme it drops to 3.9917 to 1. That still passes the 3 to 1 non-text minimum, but it's now close enough to the floor that a projector losing contrast in a bright room puts it under. The version that fails outright is the mirror error. A designer picks #6FA8FF because it looks right on the dark master. Print the same file as a handout on white and the accent renders at 2.4080 to 1, below the non-text minimum. The highlighted series is no longer the one the eye goes to.
The corrected version. Two accent values, one per theme, held as a role and not as a colour. The template's accent role resolves to #1F6FEB in the light theme and #6FA8FF in the dark, and every chart references the role. The neutral works the same way. It moves from #C4CAD2 on white to #3C4450 on night, so the emphasis ratio survives the inversion. Accent against neutral is 2.8082 to 1 in the light theme and 4.0851 to 1 in the dark.
You can run the check in four minutes. Open the deck in the theme it'll be presented in. Pick the three colours that carry information on the busiest chart and compute each against the actual background. Then confirm that every information-carrying mark clears 3 to 1 and every piece of body text clears 4.5 to 1.
Read it. The two neutral rows above fail on purpose. Saying which and why is what separates a considered palette from a careless one. The neutral fails the 3 to 1 non-text minimum in both themes, at 1.6502 and 1.8804. That's correct, because the neutral doesn't convey information a reader must decode. It's the field the accent stands against, and its values are in the labels. If a context series does carry a number a reader must read, it stops being context and it must pass. The accent-against-neutral pair, at 2.8082 to 1 in the light theme, is also below 3 to 1. That matters only where the two touch, as in a stacked bar. There, the fix is a hairline separator in the page colour. A darker neutral is the wrong repair.
These are WCAG 2.2 thresholds, checked September 2026. Verify the current thresholds and criterion numbering at w3.org, since the recommendation advances.
The checklist to apply.
- Compute contrast against the background the deck will actually be shown on.
- Hold accent and neutral as roles with a value per theme, never as one hex code.
- Check text at 4.5 to 1 and information-carrying marks at 3 to 1, separately.
- Check adjacent marks against each other where they touch.
- Declare which marks are context and therefore exempt, in the notes, before anyone asks.
- Re-run the check on the handout, because the handout is a different background.
Worked example 4: A rainbow palette that two readers in thirty cannot use (US, $)
The setting. The same Ridgeline retention data, before the small-multiple rebuild, drawn with the eight-hue categorical palette that ships as a default in several plotting libraries.
The message. A categorical palette that looks well separated to the author collapses under a common colour vision deficiency, and the failure is silent.
The data. CIE76 distances between the closest pair in the palette, under normal vision and under three dichromat simulations using the Viénot, Brettel and Mollon (1999) transforms.
| Vision | Closest pair | Distance | Second concern |
|---|---|---|---|
| Normal | #911EB4 / #F032E6 | 29.2996 | none |
| Deuteranope | #E6194B / #3CB44B | 9.2114 | #4363D8 / #911EB4 at 18.0581 |
| Protanope | #4363D8 / #F032E6 | 6.0920 | #3CB44B / #F58231 at 8.4339 |
| Tritanope | #E6194B / #F032E6 | 4.4904 | #F58231 / #F032E6 at 9.2301 |
One pair of the twenty-eight falls below a distance of 10 under deuteranope simulation and three fall below 20. Under the other two simulations, two pairs fall below 10. For comparison, the accent-and-neutral pair scores 75.5014 under normal vision, 82.9333 under deuteranope, 76.5745 under protanope and 92.2920 under tritanope.
The wrong version. Eight hues, one per series, with a legend. To the author every series is obviously distinct. To a deuteranope reader, series one and series two are the same colour. That reader has no way to know which one the speaker is pointing at. The grey-scale test finds the same failure without any simulation. Sorted by relative luminance, the eight hues run 0.1024, 0.1507, 0.1803, 0.2652, 0.3411, 0.3560, 0.5478 and 0.7518. The smallest adjacent gap is 0.0149, and three of the eight fall inside a band of 0.1144. Print the deck and three series merge.
The corrected version. The accent-and-neutral pair, whose separation comes from lightness. There's an L* gap of 32.0118 between the accent at 49.0757 and the neutral at 81.0875. Lightness survives every dichromat transform intact, so all three simulated distances for that pair come out higher than the normal-vision one. None comes out lower. If more than two categories really do need telling apart, two encodings make the question moot. One is position, meaning a small-multiple grid. The other is direct labelling, which turns hue into a redundant second channel.
Read it. The protanope figure of 76.5745 is the lowest of the three for the accent pair, and it's still far above any threshold that matters. The spread across the three makes a useful point about method, though. Each simulation names a different closest pair in the rainbow palette. They disagree with each other by a factor of two on the same colours. And the tritanope transform is the least trustworthy of the three, because it approximates a two-plane construction with one plane. None of them reproduces what any individual reader sees. Treat the numbers as a screen that catches gross failures. They aren't a certificate. The screen is worth running because gross failures are common. A default palette with a red and a green in it fails, and no author with normal colour vision will ever notice.
The checklist to apply.
- Compute the closest pair under normal vision and under deuteranope, protanope and tritanope simulation.
- Reject any palette whose closest pair falls below a distance of 20 under any of them.
- Run the grey-scale test as a second, code-free check.
- Prefer a lightness gap to a hue difference wherever a choice exists.
- Where more than two categories must be distinguished, move the distinction to position or to a direct label.
- Never rely on a red-green pair for a distinction that carries the message.
Worked example 5: Eight wedges that cannot show a 1.8-point spread (India, ₹)
The setting. Suryagarh Ceramics (synthetic) does ₹86.50 crore of FY26 revenue across eight channels. The commercial head wants to open the annual review with the channel picture.
The message. The top three channels are within 1.8 points of each other, so treating modern trade as "the main channel" is a category error. The company has three roughly equal channels and five small ones.
The data. FY26 revenue by channel, with the pie angle each share implies and the bar length it implies on a 640-pixel axis scaled to the largest channel.
| Channel | Share | ₹ crore | Pie angle | Bar length |
|---|---|---|---|---|
| Modern trade | 22.40% | 19.3760 | 80.64° | 640.00 px |
| General trade | 21.50% | 18.5975 | 77.40° | 614.29 px |
| Own website | 20.60% | 17.8190 | 74.16° | 588.57 px |
| Marketplaces | 14.80% | 12.8020 | 53.28° | 422.86 px |
| Exports | 9.30% | 8.0445 | 33.48° | 265.71 px |
| Institutional | 6.10% | 5.2765 | 21.96° | 174.29 px |
| Company outlets | 3.70% | 3.2005 | 13.32° | 105.71 px |
| Other | 1.60% | 1.3840 | 5.76° | 45.71 px |
| Total | 100.00% | 86.5000 | 360.00° |
The wrong version. A pie of eight slices with a legend, a percentage ring and a bevel on each slice. Run the stripped-chart test on it. Delete every non-data element and you have eight bare wedges. The top two differ by 0.9 points, which is 3.24 degrees of arc. The top three span 1.8 points, which is 6.48 degrees. No reader resolves six degrees of arc between non-adjacent wedges. Four of the eight slices are below 10% and hold ₹17.9055 crore between them, and you can't read any of them on its own.
Here, decluttering is the wrong repair. Strip the pie perfectly, in one accent and a neutral, with direct labels and no legend. It still can't show a 1.8-point spread. The encoding is angle, and angle is where the accuracy went.
The corrected version. A horizontal bar chart, eight bars, sorted by value because channel order isn't intrinsic. The same 0.9 points that was 3.24 degrees becomes 25.71 pixels of length difference. The 1.8-point spread across the top three becomes 51.43 pixels. You can't miss either. The top three bars carry the accent as a group, because the message is about the three of them together, and the remaining five are neutral. Direct labels at the end of each bar give the share and the rupee value. You don't need a legend or an axis. The labels carry the numbers and the length carries the comparison.
The annotation reads: "Three channels within 1.8 points, ₹1.56 crore, of each other." One light enclosure tints the region behind the top three bars. This is the one place an enclosure is worth having here, because the message is about a group. No single bar is the point.
| Pie, before | Sorted bar, after | |
|---|---|---|
| Encoding of the comparison | angle | length |
| Top-two difference as drawn | 3.24° | 25.71 px |
| Top-three spread as drawn | 6.48° | 51.43 px |
| Machine score | 0.3571 | 1.0000 |
| Composite | 0.3143 | 0.9600 |
Read it. The composite gain of 0.6457 came almost entirely from two rules, chart-choice and title-is-the-message. The declutter rule added only half a point, because the pie wasn't especially cluttered. That's why you score the seven rules separately. An overall impression wouldn't have told you that this chart's problem was never clutter. An hour spent deleting would have moved the composite by about 0.07.
What the bar still doesn't settle is whether three roughly equal channels is good news or bad. Balance reduces dependency. It also means no channel has reached the scale where its economics improve. The chart states the fact. The recommendation needs the margin by channel, and that's a different exhibit.
The checklist to apply.
- Run the stripped-chart test before touching any formatting.
- If the message is a comparison and the encoding is angle, redraw. Don't tidy.
- Sort by value unless the category order is intrinsic.
- Accent the subject of the message, which may be a group of bars and not just one.
- Convert the difference into the units the reader thinks in, here both points and rupees.
- Score the seven rules separately, so you learn which one failed.
Worked example 6: A growth map with the wrong kind of palette (US, $)
The setting. Fairmount Retail (synthetic) runs twelve US territories carrying $412.0m of trailing revenue. The regional review opens with a map shaded by year-on-year growth.
The message. Growth is split, and it isn't uniformly weak. Five territories grew, seven shrank, and the biggest decline is also one of the largest territories.
The data. Growth and revenue by territory, sorted by growth.
| Territory | Growth | Revenue | Weight | Normalised to ±11.2 |
|---|---|---|---|---|
| Pacific NW | +11.2% | $28.4m | 6.893% | +1.000 |
| Mountain | +7.9% | $21.9m | 5.316% | +0.705 |
| Southwest | +4.1% | $33.7m | 8.180% | +0.366 |
| Great Lakes | +1.3% | $46.2m | 11.214% | +0.116 |
| Mid-Atlantic | +0.4% | $58.1m | 14.102% | +0.036 |
| New England | −0.8% | $24.8m | 6.019% | −0.071 |
| Southeast | −2.6% | $51.3m | 12.451% | −0.232 |
| Plains | −3.5% | $19.6m | 4.757% | −0.313 |
| Gulf | −5.2% | $30.2m | 7.330% | −0.464 |
| Ohio Valley | −6.9% | $27.5m | 6.675% | −0.616 |
| Upper Midwest | −8.4% | $22.9m | 5.558% | −0.750 |
| Central | −11.0% | $47.4m | 11.505% | −0.982 |
The simple mean growth is −1.1250% and the revenue-weighted growth is −1.3830%, a gap of 0.258 points. Why the gap? Central, at −11.0%, is the fourth-largest territory, and on its own it contributes −1.2655 points of the weighted figure. Revenue in growing territories is $188.3m of $412.0m, or 45.7039%.
The wrong version. A sequential ramp, light green to dark green, mapped across the full range from −11.0% to +11.2%. The zero crossing falls 49.5495% of the way up the range and gets no visual mark at all. So a territory that shrank 0.8% and a territory that grew 0.4% render as almost the same mid-green. The reader sees a smooth gradient and has to read the labels to find out who's shrinking. That was the colour's job.
There's a variant that looks careful and is worse. It's a diverging red-to-green ramp anchored at the data's mean of −1.1250%, which several tools do by default. New England, at −0.8%, now lands above the anchor and is coloured as growth even though it shrank. The colour mislabels one territory in twelve, and no reader will catch it.
The corrected version. A diverging ramp anchored at zero, with symmetric limits at ±11.2, so equal deviations in opposite directions get equal ink. The hue pair is blue and orange. Green and red would fail for red-green deficiency, and red carries a loss meaning that a −0.8% territory doesn't deserve. Five equal-width classes over the range put three territories in the bottom class, three in the second, three in the middle, one in the fourth and two in the top.
Two elements do work the map can't do alone. A sorted bar chart of the same twelve values goes beside the map. A map encodes position by geography, so it can't encode rank. If you want to know who's worst, read the bar. If you want to know where, read the map. And each territory's revenue appears as a label on the bar, because a −11.0% decline in a $47.4m territory and a −11.0% decline in a $5m territory are different problems.
Read it. One decision carries this exhibit, and that's the anchor. It's a data decision, and design doesn't come into it. Growth has a meaningful centre at zero because growing and shrinking are different in kind. A rate with no meaningful centre, like a headcount or an on-time percentage, gets a sequential ramp. Force a diverging palette onto one and you invent a midpoint the data doesn't have. The palette family follows the data type. Write down the two words, ordered or unordered and centred or not, before you open the colour picker.
The checklist to apply.
- Classify the data. Is it ordered or unordered, and if ordered, centred or not?
- Set the diverging anchor at the meaning, never at the mean.
- Make the limits symmetric so equal deviations get equal ink.
- Choose a hue pair that survives red-green deficiency and doesn't import a loss meaning.
- Pair a map with a sorted bar, because a map cannot encode rank.
- Carry the size of each unit alongside its rate.
Worked example 7: Fifty-three decorations on one line (India, ₹)
The setting. Meghna Logistics (synthetic) reports on-time delivery monthly to a customer whose contract carries an SLA penalty of ₹120 per late delivery on about 42,000 deliveries a month.
The message. The August collapse was a single identifiable event. Since then the recovery has averaged 1.83 points a month, and that's the number the customer should be tracking.
The data. On-time delivery percentage by month, April to March.
| Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Jan | Feb | Mar |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 88.4 | 87.9 | 86.2 | 82.1 | 79.6 | 81.3 | 84.7 | 88.9 | 90.2 | 91.1 | 91.6 | 92.4 |
Full-year change is +4.0 points. The trough is 79.6% in August and March is 92.4%, so the recovery is 12.8 points over seven months, or 1.8286 points a month. Four of the twelve months clear the 90% target. Now put it in money. At ₹120 a late delivery, each point of on-time rate is worth ₹50,400 a month. So August cost ₹10,28,160 in penalties against March's ₹3,83,040, a difference of ₹6.45 lakh in the month.
The wrong version. The line carries eleven horizontal gridlines at ten-point intervals and twelve vertical gridlines. Add a plot border, a legend for its single series, a drop shadow on the line and a gradient fill beneath it. There's a marker on all twelve points and a data label on all twelve points, plus two axis titles. That's 53 non-data elements against 12 data points. The y-axis runs 0 to 100. At 320 pixels of plot height that gives 3.2 pixels per point, so the entire 12.8-point trough-to-peak recovery shows up as 40.96 pixels of vertical movement.
The corrected version. Eleven elements survive. There are four horizontal gridlines at 80, 85, 90 and 95, a target rule at 90 labelled once at the right, markers on the two annotated points, labels on three points, and a baseline. That's 42 of 53 deleted, or 79.25%. The axis runs 75 to 95, which gives 16.0 pixels per point and renders the same recovery as 204.8 pixels.
The axis change is the one you need to justify, and the rule is asymmetric. A line chart of a rate may start above zero as long as the axis is labelled. The encoding is the position of each point, and the reader is comparing positions. A bar chart may not, because the encoding is length, and a truncated bar lies about the ratio between its bars. That asymmetry is the honesty rule. It's also why the same axis decision is correct here and forbidden on the funnel in the first example.
The two annotations are the payload. "Aug: monsoon flooding closed the Bhiwandi hub for nine days." And "Recovery has averaged 1.83 points a month since; four of twelve months now clear the 90% target."
| Before | After | |
|---|---|---|
| Non-data elements | 53 | 11 |
| Data marks | 12 points, 1 line | 12 points, 1 line |
| y-axis | 0 to 100 | 75 to 95 |
| Pixels per point | 3.2 | 16.0 |
| Recovery as drawn | 40.96 px | 204.80 px |
Read it. The full-year change of +4.0 points is the figure a summary table would carry. It's also the least useful number on the page, because it averages an event with a recovery. Here the chart's job is to separate the two. The annotation does what no amount of decluttering can. It names the cause. Notice, too, what the axis change doesn't do. Rescaling from 0-100 to 75-95 makes the movement visible. It doesn't make the movement larger. A reader who takes the steepness as the magnitude has been misled by a chart that was drawn honestly. The label on the axis is what protects them, so you can't leave it off.
The checklist to apply.
- Count the non-data elements before deleting anything, so the reduction is a number.
- Delete in the eight-step order and stop at the four orientation questions.
- Replace a grid with one reference line at the number that matters, where one exists.
- Choose the axis range from the data's meaningful band and label it explicitly.
- Apply the zero-baseline rule to bars and the labelled-axis rule to lines. Never mix them up.
- Write the annotation that names the cause, and a second that gives the rate.
- Convert the rate into money once, so the reader knows what a point is worth.
Verify
Every figure printed above, at full precision, in the order it appears.
Nilaya funnel. Step conversions 186000/12400000 = 0.015000, 152520/186000 = 0.820000, 61008/152520 = 0.400000, 15252/61008 = 0.250000, 8388/15252 = 0.54996066, 5871/8388 = 0.69992847, 4873/5871 = 0.83001192. Impression to kept 4873/12400000 = 0.00039298 (1 in 2,544.6337). Session to payment 5871/152520 = 0.03849331. Cart to payment 5871/15252 = 0.38493313. Revenue 1450 × 4873 = 7,065,850 = 0.70659 crore. Click-step counterfactual 0.020/0.015 = 1.333333; kept 6,497.33; revenue 0.94211 crore; uplift 0.23553 crore. Cart-step counterfactual 0.255/0.250 = 1.020000, uplift 0.01413 crore; ratio of the two uplifts 16.6667. Census 100 → 29, deleted 71 = 71.0000%; data-bearing 8/100 = 0.080000 and 8/29 = 0.275862, ratio 3.448276. Non-data ink 108,696 → 41,008; data ink 166,400 → 81,260; data-ink ratio 166400/275096 = 0.604880 and 81260/122268 = 0.664606, change +0.059726. After-chart bar lengths on a 640 px linear count axis 640.00, 9.60, 7.87, 3.15, 0.79, 0.43, 0.30, 0.25 px. Delete-order cumulative 51,840; 65,040; 70,860; 79,960; 81,248; 90,400; 100,416; 108,696, shares 47.69%, 59.84%, 65.19%, 73.56%, 74.75%, 83.17%, 92.38%, 100.00%. Machine 3/14 = 0.214286 and 7/7 = 1.000000; composites 0.6(0.214286) + 0.4(0.30) = 0.248571 and 0.6(1) + 0.4(0.95) = 0.980000; gain 0.731429.
Ridgeline retention. Curve r(m) = p + (1 − p)e^(−0.42m) with plateaus 0.615, 0.628, 0.607, 0.712, 0.729, 0.741. Month-12 values 61.749239, 63.040823, 60.954418, 71.386444, 73.075439, 74.267670. Means 61.914827 and 72.909851, difference 10.995024. Month-6 means 64.750952 and 74.927199, difference 10.176247; ratio 1.080460. Seats kept at month 12 254.407, 282.423, 241.379, 357.646, 392.415, 387.677; group totals 1,256 → 778.209 = 61.959335% and 1,560 → 1,137.738 = 72.931950%; weighted difference 10.972615. Extra seats at $148 = $25,333.57. Legend 2 × 6 = 12 round trips, 12 × 0.25 = 3.00 s. Panel block 3(300) + 2(24) = 948 px wide and 2(170) + 24 = 364 px tall; segments 6 × 6 × 12 = 432. Machine 6.5/7 = 0.928571; composite 0.917143; before 2.5/7 = 0.357143 and 0.354286; gain 0.562857.
Contrast. Relative luminances #16233A 0.016781, #1F6FEB 0.176583, #6FA8FF 0.386048, #C4CAD2 0.586300, #3C4450 0.056741, #101418 0.006764, #E6E9EE 0.812739. Ratios 15.722976, 15.198644, 4.634055, 3.991662, 7.681740, 2.407993, 1.650166, 1.880427. Accent against neutral 2.808235 (light) and 4.085104 (night). Emphasis factor from greying 15.722976/1.650166 = 9.528118. Stroke ratio 3/1 = 3.0000; accent ink share at eight context lines 3/11 = 27.2727%, at twelve 3/15 = 20.0000%.
Colour-blind. Rainbow closest pairs, CIE76 after a linear-RGB Viénot-Brettel-Mollon transform: normal #911EB4/#F032E6 29.299589; deuteranope #E6194B/#3CB44B 9.211416; protanope #4363D8/#F032E6 6.091951; tritanope #E6194B/#F032E6 4.490415. Second concerns 18.058097, 8.433871, 9.230089. Pairs below 10: deuteranope 1 of 28, protanope 2 of 28, tritanope 2 of 28; below 20 under deuteranope 3 of 28. Accent-neutral distances 75.501443, 82.933281, 76.574456, 92.292000. Practice palette #3CB44B/#F58231 94.980563 normal and 26.490189 deuteranope, #3CB44B/#E6194B 129.861632 and 9.211416, #F58231/#E6194B 50.162034 and 32.597471; #4363D8/#911EB4 39.980171 and 18.058097. L* 49.075704 and 81.087546, gap 32.011842. Greyscale luminances 0.102436, 0.150748, 0.180263, 0.265196, 0.341112, 0.355995, 0.547769, 0.751806; smallest adjacent gap 0.014883; ranks 2 to 4 span 0.114448.
Suryagarh. Shares sum to 100.0000%. Angles 80.6400, 77.4000, 74.1600, 53.2800, 33.4800, 21.9600, 13.3200, 5.7600. Top-two spread 0.9000 points = 3.2400°; top-three 1.8000 points = 6.4800°. Bar lengths at 640 px 640.0000, 614.2857, 588.5714, 422.8571, 265.7143, 174.2857, 105.7143, 45.7143; gaps 25.7143 and 51.4286 px. Revenue 86.50 × share, giving 19.3760, 18.5975, 17.8190, 12.8020, 8.0445, 5.2765, 3.2005, 1.3840, summing to 86.5000. Top three 64.50% = 55.7925 crore; spread 1.5570 crore. Sub-10% channels 20.7000% = 17.9055 crore. Machine 2.5/7 = 0.357143 and 1.000000; composites 0.314286 and 0.960000; gain 0.645714.
Fairmount. Simple mean −1.125000%; revenue total $412.0m; revenue-weighted growth −1.383034%; gap −0.258034 points; Central's contribution 47.4/412.0 × (−11.0) = −1.265534 points. Revenue in growing territories $188.3m/$412.0m = 45.703883%. Symmetric limits ±11.2; normalised values as tabled. Equal-interval class edges −11.0, −6.56, −2.12, 2.32, 6.76, 11.2 with counts 3, 3, 3, 1, 2. Zero crossing 11.0/22.2 = 49.549550% of the range.
Meghna. Trough 79.6%, peak 92.4%, recovery 12.8000 points over 7 months = 1.828571 points a month. Full-year change +4.0000 points. Months at or above 90%: 4 of 12. Elements 53 → 11, deleted 42 = 79.245283%. Pixels per point 320/100 = 3.2000 and 320/20 = 16.0000; recovery as drawn 40.9600 and 204.8000 px. Money: 42,000 × 0.01 × 120 = ₹50,400 a point a month; August 42,000 × 0.204 × 120 = ₹1,028,160; March 42,000 × 0.076 × 120 = ₹383,040; difference ₹645,120 = ₹6.4512 lakh; at the 90% target ₹504,000.
Projection geometry. 1920 px across 3000 mm gives 1.5625 mm per px; magnification 3000/(13.333 × 25.4) = 8.858489. A 1 px hairline subtends 2.686, 1.074, 0.671, 0.448 arcminutes at 2, 5, 8 and 12 m. Type at 8 m: 9 pt → 12.09′, 12 pt → 16.11′, 14 pt → 18.80′, 18 pt → 24.17′, 24 pt → 32.23′. Marks at 8 m: 2 px → 1.34′, 3 px → 2.01′, 8 px → 5.37′, 34 px → 22.83′.
Practice set
Work each one before you read the solution. You'll want a calculator, and a few problems are easier with a short script than with arithmetic. Numeric answers within 2% of the stated figure count as correct unless a problem says otherwise. Where a problem asks for a described layout, the test is whether another analyst could build it from your description without asking a question.
P1 (guided). Rank the funnel's losses (India). Nilaya's October funnel runs 12,400,000 impressions, 186,000 clicks, 152,520 sessions, 61,008 product page views, 15,252 carts, 8,388 checkouts, 5,871 payments and 4,873 kept orders. Compute the step conversion for sessions to page views and for carts to checkouts, state which single step loses the most users in absolute terms, and say what that implies for the accent on the rebuilt chart.
Solution. Sessions to page views is 61,008/152,520 = 40.0000%, a drop of 60.0000 points, losing 91,512 users. Carts to checkouts is 8,388/15,252 = 54.9961%. The step that loses most in absolute terms is impressions to clicks, which loses 12,214,000 users at a conversion of 1.5000%. The second worst by rate is page views to carts at 25.0000%, a gap of 23.5 points. So the accent marks the first transition. The annotation should carry the absolute figure, and the rate can stay off it. 98.5% and 75% are the same order of magnitude, while 12.2 million and 45,756 aren't. A common wrong answer accents the largest bar, which is the impressions bar. But the largest quantity isn't the message.
P2 (guided). Census a chart (US). A revenue-by-quarter chart carries 14 gridlines, 6 legend keys, 1 legend frame, 24 data labels, 1 plot border, 2 axis titles, 6 drop shadows, 6 distinct hues and 6 data marks. Compute the element total, the data-bearing share, and the same two figures for a rebuild consisting of 6 marks, 6 direct labels, a baseline, an accent, a neutral and a two-line annotation.
Solution. Before: 14 + 6 + 1 + 24 + 1 + 2 + 6 + 6 + 6 = 66 elements, of which 6 are data-bearing, a share of 6/66 = 0.0909. After: 6 + 6 + 1 + 1 + 1 + 2 = 17 elements, 6 data-bearing, a share of 6/17 = 0.3529. Deleted 66 − 17 = 49 elements, or 74.2424%. Notice what the census settles and what it leaves open. The share nearly quadrupled. The chart could still be the wrong form, though. Its title could still be a noun phrase. The census measures clutter alone.
P3 (guided). Run the contrast check (India). Four colours are proposed for a deck: #7A8CA6 for axis labels on white, #1F6FEB for the accent on white, #6FA8FF for the accent on #101418, and #F2C744 for a highlight on white. Compute each contrast ratio and give a verdict at 4.5 to 1 for text and 3 to 1 for non-text marks.
Solution. #7A8CA6 on white is 3.4261 to 1. It fails as text and passes as a non-text mark, so it may be a gridline but not an axis label. #1F6FEB on white is 4.6341 to 1 and passes both. #6FA8FF on #101418 is 7.6817 to 1 and passes both. #F2C744 on white is 1.6119 to 1 and fails both. That's the yellow trap. Relative luminance weights green at 0.7152, so a bright yellow against a bright page has almost no contrast, however vivid it looks. Use it on a dark ground or not at all.
P4. Price the legend (US). A dashboard carries three charts with 4, 7 and 11 series, each with a legend. For the task "name the highest series at the right-hand edge", compute the legend round trips and the chart-choice table time at an assumed 250 ms per fixation-and-saccade cycle, and state the total cost of the dashboard's legends for that one question.
Solution. Round trips are twice the series count: 8, 14 and 22, for 2.00, 3.50 and 5.50 seconds, a total of 11.00 seconds across the three charts. Direct labels cost zero extra round trips in every case. State the assumption when you quote the figure. 250 ms is a working estimate for a fixation-and-saccade cycle. Nobody measured it on your reader. Still, the comparison between 44 round trips and none survives any plausible value of it.
P5. Test three hues (US). A chart distinguishes three series by #3CB44B, #F58231 and #E6194B. Compute the CIE76 distance for each pair under normal vision and under deuteranope simulation, and state whether the palette is usable.
Solution. Normal vision gives 94.9806 for green against orange, 129.8616 for green against red, and 50.1620 for orange against red. Under deuteranope simulation, green against orange falls to 26.4902 and orange against red to 32.5975. Both are still above the working threshold of 20. Green against red collapses to 9.2114. The palette isn't usable. The message depends on separating all three, and the pair that goes is the one an author least suspects. Green and red look as different as two colours can to normal colour vision, so nobody notices 129.86 falling to 9.21. If the message concerns green, the cheap fix keeps green as the accent and makes the other two a single neutral. If all three matter, the proper fix is three panels.
P6. Convert the spread (India). A pie shows four segments at 27.3%, 26.1%, 25.4% and 21.2%. Confirm the shares sum, give each segment's angle, compute the A-to-B and A-to-C differences in points and in degrees, and give the A-to-B difference as pixels on a 600-pixel bar axis scaled to A.
Solution. The shares sum to 100.0000%. Angles are 98.2800°, 93.9600°, 91.4400° and 76.3200°. A minus B is 1.2000 points, which is 4.3200 degrees. A minus C is 1.9000 points, which is 6.8400 degrees. On a 600-pixel bar axis scaled so that A is full width, A minus B is 1.2/27.3 × 600 = 26.3736 pixels. Four degrees of arc between two non-adjacent wedges can't be resolved. 26 pixels of length difference can. The argument is that comparison. It has nothing to do with liking bars.
P7. Check the cohort story (US). Ridgeline's month-twelve retention by cohort is 61.7492, 63.0408, 60.9544, 71.3864, 73.0754 and 74.2677 percent for January through June. The month-six figures are 64.5977, 65.7931, 63.8621, 73.5172, 75.0805 and 76.1839. Compute the first-three against last-three gap at both horizons, give the ratio, and say what it means for when the analysis could have been run.
Solution. At month twelve the means are 61.9148% and 72.9099%, a gap of 10.9950 points. At month six they are 64.7510% and 74.9272%, a gap of 10.1762 points. The ratio is 1.0805, so the month-twelve gap is only 8% wider than the month-six gap. The finding was 93% visible six months earlier, and waiting for the twelve-month figure bought very little. That's a claim about the analysis timetable, and the chart can't make it. It belongs in the speaker notes. A board that learns it could have known in December will ask why it didn't.
P8. Score three slides (India). Three candidate slides score on the seven rules as follows. Slide 1: [1, 1, 1, 0.5, 1, 1, 1] with a committed rubric self-score of 0.80. Slide 2: [1, 0.5, 1, 0, 0.5, 0.5, 1] with 0.55. Slide 3: all seven at 1 with 0.90. Give each machine score and composite, and state which pass at 0.80 and at the crown's 0.90.
Solution. Slide 1: machine 6.5/7 = 0.9286, composite 0.6(0.9286) + 0.4(0.80) = 0.8771, which passes at 0.80 and fails at 0.90. Slide 2: machine 4.5/7 = 0.6429, composite 0.6057, failing both. Slide 3: machine 1.0000, composite 0.9600, passing both. Look at slide 1. A single half on title-is-the-message costs 0.0714 of machine score and 0.0429 of composite. That's the whole distance between passing an ordinary gate and passing a crown. Rewriting a title takes two minutes.
P9. Anchor the scale (US). Seven regions post growth of 6.4, 3.1, 0.9, −0.2, −1.8, −4.7 and −9.3 percent. State the palette family, give the anchor and the limits you would set, and compute how many regions would be miscoloured if the scale were anchored at the data's mean instead.
Solution. The data is ordered and has a meaningful centre, so the family is diverging. The anchor is zero and the limits are symmetric at ±9.3000, so that equal deviations in opposite directions get equal ink. The mean is −0.8000. Anchor there and the −0.2% region is coloured as growth, because −0.2 is above −0.8. Every growing region stays correctly coloured. That's one region in seven, or 14.2857%, miscoloured in the direction that flatters. The same error on the Fairmount territories miscolours New England at −0.8% against a mean of −1.1250%. Software offers the mean anchor as a default, and it's wrong wherever the centre carries meaning.
P10. Compute the emphasis (India). A chart has one accent line at 3 pixels and eight context lines at 1 pixel, all over paths of 640 pixels. Give the accent's ink against one context line, the accent's share of total line ink, and the factor by which greying the context from #16233A to #C4CAD2 changes its contrast against a white page.
Solution. The accent is 3 × 640 = 1,920 square pixels against 640 for one context line, a ratio of 3.0000. Eight context lines total 5,120, so the accent carries 1,920/7,040 = 27.2727% of the line ink while being one series of nine. Greying takes the context from 15.7230 to 1 down to 1.6502 to 1, a factor of 9.5281. The two effects compound and neither touched the accent. You make emphasis by changing the field. The mark stays as it is.
P11. Price the grid (US). A plot area is 760 by 420 pixels and carries 7 horizontal and 9 vertical gridlines at 1 pixel. Compute the gridline ink, its share of the plot area, and the reduction from keeping only 3 horizontal lines. Then say which of the two orientations to delete first and why.
Solution. Gridline ink is 7 × 760 + 9 × 420 = 9,100 square pixels, which is 9,100/319,200 = 2.8509% of the plot area. Keeping three horizontal lines leaves 3 × 760 = 2,280 square pixels, or 0.7143% of the plot, a reduction of 74.9451%. Delete the vertical lines first. On a chart where the position of the marks already shows the categories, vertical gridlines duplicate the axis labels and cut across the shape the reader is trying to see. Horizontal lines at least support reading a value off the scale, and somebody may do that lookup.
P12. Write the annotation (India). Meghna's on-time series runs 88.4, 87.9, 86.2, 82.1, 79.6, 81.3, 84.7, 88.9, 90.2, 91.1, 91.6, 92.4 from April to March. Compute the recovery from the trough, its monthly rate, and the money at stake for one point of on-time rate on 42,000 monthly deliveries at a ₹120 penalty. Then write the two annotations, each under twenty words.
Solution. The trough is 79.6% in August and March is 92.4%. The recovery is 12.8000 points over 7 months, or 1.8286 points a month. One point of on-time rate on 42,000 deliveries at ₹120 is 42,000 × 0.01 × 120 = ₹50,400 a month. Here are two annotations that pass the honesty test: "Aug: monsoon flooding closed the Bhiwandi hub for nine days." and "Recovery has averaged 1.83 points a month since; each point is worth ₹50,400." The first names a cause the chart can't show. The second gives the rate and prices it. What fails? "On-time delivery has recovered strongly" states nothing checkable. "Back on track" isn't supported by four of twelve months above target.
Applied mini-project
Three charts, rebuilt, with the evidence. Budget about three hours. We supply one chart from the India examples and one from the US examples. The third is your own, taken from any analysis you've already done or from any deck somebody has sent you.
For each of the three, produce four artefacts.
Artefact 1: the census. A table of every visual element with its count, split into encodes-a-number and encodes-nothing, with a total for each and the data-bearing share. Do this before deleting anything. Test 1: the counts reconcile, so the two columns sum to the total, and the data-bearing count matches the number of values the chart actually plots.
Artefact 2: the delete list, in order. The eight steps, each one either applied with what it removed or explicitly skipped with the reason. Where you keep gridlines, name the chart-choice table a stated reader performs. Where you keep a legend, name which of the four legitimate cases applies. Test 2: every element in the encodes-nothing column of Artefact 1 appears either in the delete list or in a keep line with a named reason. No element is unaccounted for.
Artefact 3: the colour decision. Give two words for the data type, ordered or unordered and centred or not, and the palette family that follows. Give the accent and the neutral as hex values. Add the contrast ratio of every information-carrying mark against the background in the theme the chart will be shown in, and the closest-pair distance under deuteranope simulation. Test 3: every ratio clears 3 to 1 for marks and 4.5 to 1 for text, or the mark is explicitly declared context; the closest pair clears 20; and the accent marks the subject of the title.
Artefact 4: the rebuilt chart and its scores. The rebuild, plus the before and after machine scores on the seven rules, plus a rubric self-score committed in writing before you see the machine's result, plus the composite for each. Test 4: the after-composite is at or above 0.80, and the before-composite is recorded at the time and not reconstructed afterwards.
The supplied charts. The India chart is the Suryagarh channel pie: eight slices, a legend, a percentage ring, a bevel per slice, on FY26 revenue of ₹86.50 crore split 22.4, 21.5, 20.6, 14.8, 9.3, 6.1, 3.7 and 1.6 percent. The US chart is the Ridgeline retention line: six cohorts in six default hues, a legend, eleven gridlines, markers on all points, a 0-to-100 axis, with the month-twelve values 61.7492, 63.0408, 60.9544, 71.3864, 73.0754 and 74.2677 percent.
A note on the third chart. Pick one you built and not one you admire. Make it a recent one. The point of the exercise is the gap between what you thought you were doing and what the census says you did. You only learn from that gap on your own work. If the census on your own chart comes out cleaner than either supplied chart, say so and move on. Finding that your habits are already good is a real finding, and the delete list will still contain something.
Rubric. Twenty points, passing at 16, with no zero on any row.
| # | Criterion | 0 | 1 | 2 |
|---|---|---|---|---|
| 1 | The census reconciles (Test 1) | absent or does not sum | sums, data count wrong | sums, and the data count matches the plotted values |
| 2 | The delete list is in order | ad hoc | in order, gaps unexplained | all eight steps applied or skipped with a reason |
| 3 | Kept elements are justified | kept without reason | reason given, no reader named | the chart-choice table and the reader who performs it are both named |
| 4 | The data type is classified | not stated | one word | ordered/unordered and centred/not, both stated |
| 5 | The palette family follows the type | mismatched | matched, anchor unstated | matched, with the anchor and the limits stated |
| 6 | Contrast is computed, not asserted | asserted | computed in one theme | computed in the theme of use, with every mark listed |
| 7 | Colour-blind safety is tested | untested | one simulation | closest pair under all three, or the encoding made hue-free |
| 8 | The accent marks the title's subject | no accent, or it contradicts the title | accent present, subject unclear | accent and title name the same thing |
| 9 | The rubric self-score was committed first | not committed | committed after | committed in writing before the machine result |
| 10 | The after-composite clears 0.80 (Test 4) | below 0.70 | 0.70 to 0.799 | 0.80 or above, with the before-score recorded |
Any artefact whose test fails scores zero on its row, however good the rebuild looks. A beautiful chart with an unreconciled census scores zero on row 1. The census is your evidence that the improvement happened. Without it, you only have the claim.
Reading & resources
Core (do these).
- Edward Tufte, The Visual Display of Quantitative Information (1983): the origin of data ink, chartjunk and the lie factor. Read it for the standard of care, and don't follow it to the letter. People have argued with several of its prescriptions since, and Tufte's own later books soften them. [Paid] [Intermediate]
- Cole Nussbaumer Knaflic, Storytelling with Data: the clearest working treatment of decluttering and focus for a business audience, and the closest published match to the grammar taught here. Its exercise volume, Let's Practice, is the better buy if you want repetitions more than argument. [Paid] [Beginner]
- Stephen Few, Show Me the Numbers: the reference for table and graph design, and the book to open when you want the reason behind a rule as well as the rule. Few's treatment of gridlines, fill and emphasis is more practical than Tufte's and more opinionated than most. [Paid] [Intermediate]
- Colin Ware, Information Visualization: Perception for Design: the standard treatment of pre-attentive processing, colour perception and visual search. It's heavier than the others and worth it, because that's where the claims in the pre-attentive section above actually come from. [Paid] [Advanced]
- Alberto Cairo, How Charts Lie: short, current and the best single treatment of the ways a chart misleads without anyone intending it, including axis choices and palette anchoring. [Paid] [Beginner]
Going deeper.
- William Cleveland and Robert McGill, "Graphical Perception: Theory, Experimentation, and Application to the Development of Graphical Methods", Journal of the American Statistical Association, 1984: the measured ranking of elementary perceptual tasks that underpins the bar-beats-pie argument. Usually reachable through a university library. [Paid] [Advanced]
- Jacques Bertin, Semiology of Graphics (1967, English translation 1983): the original catalogue of the visual variables, and the source most later frameworks are reorganising. [Paid] [Advanced]
- Bateman and colleagues, "Useful Junk? The Effects of Visual Embellishment on Comprehension and Memorability of Charts", CHI 2010: the paper that complicates the data-ink prescription, freely available from the ACM's open listings and from the authors' pages. Read it before you argue either side. [Free] [Intermediate]
- Viénot, Brettel and Mollon, "Digital video colourmaps for checking the legibility of displays by dichromats", Color Research and Application, 1999: the transforms used in the colour-blind simulations above. You need this only if you are implementing the check yourself, which takes about twenty lines. [Paid] [Advanced]
Standards and tools (free).
- W3C Web Content Accessibility Guidelines: the contrast minima are 4.5 to 1 for normal-size text, 3 to 1 for large text, and 3 to 1 for graphical objects that convey information (WCAG 2.2, checked September 2026; confirm at w3.org, since the recommendation advances and criterion numbering can move).
- ColorBrewer, at colorbrewer2.org: Cynthia Brewer's palette selector, organised by the same three families taught above, with a colour-blind-safe filter and a print-safe filter. It was built for maps and it is the fastest way to pick a defensible sequential or diverging ramp for anything.
- A dichromat simulator: Coblis and the simulation modes built into several design tools do the same job as the code above with no code. Any of them is enough to catch the gross failures; none of them reproduces what an individual reader sees.
- Your plotting library's default palette documentation: read it once and find out which family the default belongs to. Several libraries hand out a categorical palette by default and apply it to ordered data without comment. That's the error in the sixth example above (checked September 2026; confirm against your own installed version, since defaults change between releases).
Do this, not just read. Take the last chart you made and count its elements. Don't estimate. Count, and write it down in two columns. Most analysts are surprised by a factor of three, and the surprise is worth more than any chapter above.
Teach it back & journal
Feynman prompt. You have a colleague who thinks chart design is a matter of taste. Explain to them why it's mostly arithmetic, using four numbers and no adjectives. A one-pixel gridline subtends 0.671 arcminutes at eight metres, which is below what an eye can resolve. So every hairline on a projected chart is haze the back row can't read. A legend on six series costs twelve fixation round trips, about three seconds, before any thinking starts. The default red and green in an eight-hue palette collapse to a perceptual distance of 9.21 under deuteranope simulation. About one man in twelve can't separate two of your series, and he won't say so. And a 0.9-point difference is 3.24 degrees on a pie and 25.71 pixels on a bar. That's why the same data is invisible in one form and obvious in the other. Then make the harder point. None of those four numbers tells your colleague whether the chart's claim is true. The arithmetic doesn't reach that far, and that's why the machine score carries 60% and not 100%. If they can say back, unprompted, why deleting alone isn't the goal, you've taught the idea. Otherwise you've only taught the rules.
Journal prompt. Open the last chart you made for someone else and do three things to it. First, count its elements in two columns, encodes-a-number and encodes-nothing. Write the two totals down before you form an opinion. Most analysts are out by a factor of three on the second column. Second, name the accent and name the subject of the title, in that order, and be truthful about whether they're the same thing. Third, run the stripped-chart test. Delete every non-data element in your head and ask whether the message survives. Then write one line saying whether your chart needed tidying or redrawing. After that, write a paragraph on which of the two halves of the habit you're weaker at. Analysts who came to this from spreadsheets usually under-delete. Every element arrived with a reason, and nobody ever revisited the reasons. Analysts who came from design usually over-delete and under-annotate, so their charts are clean and silent. Both failures feel like competence from the inside, so trust the element count and the title-accent match over your impression. Finish with one habit small enough to survive a bad week: a two-column count written before any formatting, on every chart, for a month.
This module's flashcards and mastery quiz are wired into the app: see the node's Quiz and Reviews.