Memra

Zero-based bars, honest time axes, index to 100

◈ 9 cards

A bar's length is its value, so its axis starts at 0 — a monthly chart cut at 1500 makes February look ten times January. Two series of different size are compared by indexing both to 100: =C2/$C$2*100 and monthly / monthly[1] * 100 give 100, 159.0, 122.4.

The chart that made February ten times January

Monthly sales — Jan 1610, Feb 2560, Mar 1970 — go on a column chart, and Excel, seeing that every value is above 1500, starts the value axis at 1500 to "use the space". The Jan column is now 110 units tall and the Feb column 1060: February looks nearly ten times January. The real ratio is 1.59. Nobody lied in a cell; the axis did.

A bar or column chart encodes value as length, so the reader compares lengths — and a length is only a value when it starts at zero. A bar chart's value axis starts at 0, always. Reset it (Format Axis → Bounds → Minimum 0 in Excel; the axis Min in the Sheets chart editor) and February is 1.6 Jan columns tall, which is the truth.

A line chart encodes value as position, not length, so its axis may start above zero to show a small movement — but the chart must say so, with the axis clearly labelled from its true minimum, and a bar chart may never do it. The same logic bans the other classic distortions:

  • Changed time granularity — months on the left of the axis, quarters on the right — makes the right-hand bars look like a surge. One unit per period, the whole way across.
  • Unequal histogram bin widths — bins of 0–300, 300–600, then 600–1500 — make the wide bin's column tall because it holds more values, and the reader sees area. Equal widths, or none of it.
  • A secondary (dual) axis — one series on the left scale, another on the right — lets the analyst make the lines cross wherever they like by picking the two scales. It is the tool that invites the misreading; the fix is below.

Worked example — comparing a small company with a big one

Maple & Birch's three months are in the thousands. Its national competitor reports 2.4 M, 2.7 M, 2.6 M for the same months. On one chart the competitor's line is a plateau across the top and Maple & Birch is a flat line on the floor; on a dual axis the analyst can make either one "win". The honest comparison is to ask a different question — who grew faster from January? — and index both series to January = 100: every value divided by its own first value, times 100.

In Sheets or Excel, with the months in C2:C4: =C2/2*100, filled down. The absolute row keeps January as the base for every row. Maple & Birch: 100 · 159.0 · 122.4. The competitor: 100 · 112.5 · 108.3. Now both lines start at 100 and the chart says what it should: the small company's February jump was proportionally far larger.

In R the same arithmetic is one line, because division is vectorised and monthly[1] is the base:

> monthly <- c(1610, 2560, 1970)
> monthly / monthly[1] * 100
[1] 100.0000 159.0062 122.3602
> round(monthly / monthly[1] * 100, 1)
[1] 100.0 159.0 122.4

An index of 159.0 reads as 59 % above January — it is the percent-change column of Module 5 plus 100.

Type both, compute the index, then judge four axes

Type the Sheets formula and the R line; the code block reproduces the index in Python; the numeric asks for February's index. The questions each show an axis and ask whether it is honest.

CRISP-DM: an honest axis is evaluation → review process; indexing is data preparation → construct data done for the chart.

NORMAL ~/memra/learn/afm-112/axis-honesty-and-normalising-series utf-8 LF