Visualization Principles
The grammar of honest charts
Charts are arguments made visible. A few rules — start axes at zero, respect data-ink ratio, encode magnitude by length — produce charts readers trust faster than any fancy rendering.
What you will learn
- Apply data-ink and honest-axis rules
- Match encoding to data rank (length, position, color)
- Design for the viewer's reading order
What is this?
Visualization principles turn raw charting into communication: encode magnitude with length and position (the most accurate), reserve color for categories moderation, start bar axes at zero, cut non-data ink, and lead the eye in reading order. Followed, they make numbers obvious; ignored, they deceive even honest data, promised.
Why do you need it?
- Bars with truncated axes exaggerate differences audiences mistake for scale.
- Color chosen casually misrepresents severity and sequence.
- Readable charts beat pretty ones in every decision meeting.
- The principle question behind every chart is: does this encode truth proportionally?
Mental model
A shop scale that measures honestly
A well-built chart
The scale starts at zero and its pointer travel matches true weight — no undetectably heavy base, no pre-tensioned needle. A chart should be that scale: proportional, zero-anchored, legible at a glance.
How it works
- Encode quantitative values with position/length (bars, points), not area (pies, bubbles).
- Start bar axes at zero; use broken axes only with explicit visual breaks.
- Cut non-data ink: gridlines behind data, chart junk, redundant labels.
- Order categories by value (or chronology) so reading scans naturally.
- Use color for a single purposeful role — category, magnitude, or emphasis — consistently.
- Favor small multiples over dense single charts for honest comparisons.
Principle → chart → reader.
Examples
Two charts, one honest
ax = data.plot.bar(y="revenue")ax.set_ylim(0, data.revenue.max() * 1.1) # zero-anchoredax0 = data.plot.bar(y="revenue")ax0.set_ylim(data.revenue.max() * 0.9, data.revenue.max() * 1.02) # deceptive# Lean: readers cannot see relative size with a truncated axisThe top chart's zeroed axis lets length encode honestly; the bottom's cut axis invents contrast that isn't there.
In production
- A weekly revenue chart enforces ylim(0, ...) so a 3% wobble never looks like a cliff.
- A marketing dashboard strips gridlines and orders cohorts by activation for fast scanning.
- A risk report encodes severity with a two-color palette only — no rainbow severities.
Best practices
- Default to zero-anchored bars; escalate to dots when small deltas matter, and say so.
- One chart, one claim — split claims across panels.
- Label directly at data points over legend-color archaeology.
- Annotate exceptions: a call-out beats a legend for the thing that matters.
Common mistakes
- Pie charts for ratios among many slices — angles are hard to read.
- Truncated y-axis to 'emphasize' a difference the data doesn't own.
- Rainbow color mappings that imply sequence/severity at random.
- Gridlines and decorations reducing the data to background noise.
Debugging tips
- If a chart 'looks off', check the axis range and color encoding before the data.
- A flat chart hiding real change → dot or log scale with an honest note.
- When a legend is required to decode basic meaning, the encoding failed.
- Print the same claim with two scales and ask which the eye would trust.
Interview checkpoint
Hands-on lab
- Spot truncated axes and mis-encoded encodings
- Replot honestly with zero-based, sorted bars
- Annotate the corrected claim
Reform an Untrustworthy Chart
25 min · beginner
Quick quiz
The most accurate encodings for numeric magnitude are:
A truncated y-axis is acceptable when the difference is real.