7 Sankey diagram mistakes that make people misread your data
A badly designed Sankey wastes a reader's time. A badly built one misinforms them. These are the seven failures worth checking for before you publish, roughly in order of how much damage they do.
1. Nodes that do not balance
If 100 flows into a node and 80 flows out, the missing 20 has to go somewhere visible. Silent leakage is the single most common way a Sankey ends up lying, and it usually comes from copying subtotals rather than raw lines.
2. Mixing units in one chart
Revenue in euros flowing into headcount in people produces a picture that is geometrically meaningless. Every ribbon in a Sankey has to be measured in the same unit, because they are all compared by width.
3. Double counting a shared total
Gross profit and operating profit both descend from revenue, but drawing revenue into both makes revenue appear twice. Chain them instead: revenue to gross profit, gross profit to operating profit.
4. Colour that carries no rule
If green means profit in one place and just decoration in another, the reader has no way to trust it. Pick a rule and apply it everywhere, or use one neutral colour throughout.
5. Labels the reader has to zoom into
Most Sankeys are consumed on a phone or inside a slide. If the value text is unreadable at half size, the chart has failed regardless of how correct the numbers are.
- 6. Percentages that do not sum to 100 because of hidden rounding.
- 7. A title that names the dataset instead of stating the finding.
A quick audit habit: pick the three biggest nodes, add up their inputs and outputs, and read the title out loud. Most published errors do not survive that.
Frequently asked
Why does my Sankey diagram not balance?
Usually because a subtotal was imported alongside the lines that compose it, so the same amount is counted twice. Import raw lines only and let the diagram compute the totals.
Can a Sankey show negative values?
Not directly — width cannot be negative. Model a negative as a flow in the opposite direction, or as an outflow to a dedicated loss node.