Appearance
Small multiples for comparison work because every panel shares one set of axes and one encoding, so the reader compares shapes, not numbers. The single most important rule is therefore consistency: identical scales, identical colours, identical panel size and a meaningful panel order. Get those four things right and a grid of forty tiny charts becomes far more legible than one overcrowded line chart.
This guide gives the working checklist I use when comparing trends across parishes, decades, occupations or record series, with the trade-offs that decide each setting.
What makes small multiples good for historical comparison?
Historical data is naturally faceted. You rarely have one time series — you have the same measurement repeated across many units: baptisms per parish, prices per market town, literacy per census district. Overlaying twenty such series on one axis produces spaghetti. Small multiples break the spaghetti into a grid where each unit gets its own panel but every panel obeys the same rules, so the comparison is fair by construction.
The cost is space and resolution: each panel is small, so fine detail is lost. Accept that trade — small multiples answer "how do these units differ in shape and level?", not "what was the exact value in 1841?".
Should every panel share the same axes?
By default, fix both axes across all panels. A shared y-axis is what lets a reader say "this parish's mortality spike dwarfs the others" — the whole comparison collapses if each panel rescales itself.
There is one honest exception. When magnitudes differ by orders of magnitude and you genuinely care about the trend shape rather than the level, a free y-axis per panel is defensible — but you must label it loudly. In ggplot2 this is the difference between:
r
# Shared scale — the default, best for fair comparison
ggplot(df, aes(year, value)) +
geom_line() +
facet_wrap(~ parish)
# Free y-axis — only when comparing shape, NOT magnitude
ggplot(df, aes(year, value)) +
geom_line() +
facet_wrap(~ parish, scales = "free_y")Never silently mix the two. A reader assumes shared scales unless told otherwise.
How do I order and lay out the panels?
Order carries meaning, so spend it deliberately. Sort panels by peak value, total, or slope rather than alphabetically — that way the grid itself reads as a ranking. Reserve alphabetical order for reference grids where readers look up a named unit.
For layout, keep a roughly square grid or one that matches the reading direction (left-to-right, top-to-bottom). Add a faint reference line — a shared mean, a known event year — repeated in every panel so the eye has an anchor.
| Decision | Default | Switch when |
|---|---|---|
| y-axis | Shared, fixed | You compare shape not magnitude (and you label it) |
| Panel order | By a meaningful metric | Readers must look up a named unit |
| Panel count | 4–30 | Use grouping/faceting beyond ~50 |
| Reference line | Shared mean or key year | No meaningful common baseline exists |
| Highlight | Grey all, colour one | Comparing two or three named units |
When do small multiples beat a single chart?
Use the five-series rule of thumb: once a single overlaid chart carries more than about five lines, or the lines cross frequently, switch to small multiples. Below that, an annotated single chart is more compact and lets readers see crossings directly. The break-even point is lower for noisy historical series, where overlap hides everything.
How do I keep them honest and reproducible?
The same data-quality discipline applies as to any historical visualisation. Document the scale choice, the panel order metric and any gaps in your caption. If a parish has missing years, draw the gap as a break, not an interpolated straight line — a flat line across a registration gap is a quiet lie. Generate the grid from a script so the choice of scales and order is reproducible and reviewable, not buried in a spreadsheet's manual layout.
Key Takeaways
- Small multiples compare shapes under one shared frame; consistency of scale, colour, size and order is the whole technique.
- Default to a shared, fixed y-axis; only free it to compare trend shape, and label that choice prominently.
- Order panels by a meaningful metric (peak, total, slope), not alphabetically, so the grid reads as a ranking.
- Switch from a single chart to small multiples once you exceed roughly five series or lines cross too often.
- Add a repeated reference line in every panel as a shared anchor for the eye.
- Render gaps as breaks, never interpolated lines, and document scale and order choices in the caption.
facet_wrap(R), Vega-Lite facet, FacetGrid (Python) and Datawrapper split enforce shared scales for you.
Frequently Asked Questions
What is a small multiples chart?
A small multiples chart is a grid of small panels that share identical axes, scales and encoding, with each panel showing one slice of the data — one parish, one decade, one occupation. The shared frame lets the eye compare shapes directly rather than reading numbers off a legend.
When should I use small multiples instead of one combined chart?
Use small multiples once a single overlaid chart needs more than about five series, or when lines cross so often that individual trajectories are unreadable. Below that threshold a single annotated line chart is usually clearer and more compact.
Should every panel share the same y-axis?
For honest comparison, yes — a shared, fixed y-axis is the default. Only switch to a free (per-panel) y-axis when you care about the shape of each trend rather than its magnitude, and you must label that choice prominently so readers do not misread relative size.
How many panels are too many?
Most readers handle 4 to 30 panels comfortably. Beyond roughly 50 panels the grid becomes a texture you scan rather than read, which is fine for spotting outliers but poor for precise comparison; consider grouping or faceting by a second variable instead.
What order should I put the panels in?
Order by a meaningful quantity — peak value, total, or rate of change — not alphabetically, unless readers need to look up a specific named panel. A meaningful order turns the grid itself into a ranking the reader can read at a glance.
Which tools make small multiples easily?
ggplot2's facet_wrap in R, Vega-Lite's facet encoding, Datawrapper's split feature, and matplotlib/seaborn's FacetGrid in Python all produce small multiples with a single shared scale by default. Each enforces consistent axes, which is the whole point.