MisleadingCharts
Back to the gallery

The heat map that paints its hottest hour darkest

Showing the misleading chart

Be the first to star this exhibit

A year of hourly air temperature, 288 cells, one linear unbroken scale — drawn on the jet colour map. Its brightest cells are the 28 °C ones; the hottest hour of the year, at 41.83 °C, comes out darker than a January night. 281 of the other 287 cells are painted lighter than it, and 19,222 of the 41,326 pairs of cells are in the wrong lightness order. Nothing is binned, capped or smoothed: the ramp simply spends its lightness out of order.

01The claim

Every hour of the year on one map. 8,760 hourly air-temperature values for one place, averaged into one cell for each hour of the day in each month — 288 cells, with every value in exactly one of them and 28 to 31 values behind each. The colour scale sits under the map, linear and unbroken, running from the coldest cell to the hottest, 3.60 °C to 41.83 °C. Nothing is binned, so no bin edge was chosen. Nothing is capped, smoothed, indexed or set aside, and there is no axis here to truncate. Read the map for where the building works hardest, and the answer is not the one the calendar would give: the bright band runs along the shoulder hours and the shoulder months, and the August afternoons sit at the dark end of the scale, alongside the January nights. 281 of the 288 cells read lighter than the darkest cell of the afternoon block. Two hard edges frame the band and the map is broad and flat between them. The five brightest cells on the page are July at 06:00, April at 13:00, May at 22:00, September at 02:00 and June at 04:00. Dispatch note: hold the battery for the bright band, let it ride through the dark blocks, and book the plant-room maintenance window for August, 15:00 to 18:00 — on this map it is the calmest cell of the year. And why a rainbow? Because a full spectrum uses the whole visible range, so the eye has more to work with than a single-hue fade: more distinguishable steps, and a colour name for every level. It is the standard engineering map, and readers are accurate at looking a value up against its key.

02The trick

Every number on that slide is right and the audit comes back clean, because the usual crimes are not available here: there is no axis to truncate, no bin edge to gerrymander, no series to index and no cell to leave out. The scale is linear, unbroken, printed, and stretched exactly once across the data. What is wrong is the order the colours arrive in. A colour ramp is an axis — it converts a quantity into an appearance and asks the reader to convert it back — and lightness is the one channel with an order everybody already agrees on. Hue has none until a convention supplies one, and jet does not spend its lightness in order. Measured as CIE L*, it climbs from 12.9 at the coldest cell, through the cyans, to a peak of 95.9 at 28.0 °C, and then falls away into the dark reds, reaching 25.4 at the hottest cell of the year. So the brightest cells on that map are the 28 °C ones — July at 06:00, April at 13:00 — every one of them 13.8 to 14.5 degrees short of the year’s peak; 281 of the other 287 cells are painted lighter than the 41.83 °C August afternoon; and of the 41,326 pairs of cells with an order to get wrong, 19,222 are painted in the wrong lightness order. Print it in black and white and January 03:00 at 6.74 °C and August 17:00 at 41.51 °C — 34.8 degrees apart — come out at L* 27.6 and 27.5, the same shade. The rate is wrong as well as the direction. Equal steps of data buy wildly unequal steps of colour: one degree of air is worth ΔE00 17.08 across the cyan edge at 16.6 °C and 0.46 in the blues at 7.8 °C, a 37:1 spread across one scale. On the real cells that comes out as January 13:00 and April 08:00, 1.07 degrees apart and drawn at 18.08 units of colour per degree, against February 07:00 and December 08:00, 0.91 degrees apart and drawn at 0.51 — the same air, thirty-six times louder in one place than the other. That is what makes the two “hard edges” the dashboard is scheduling around: they are places where the ramp accelerates, not places where the air does anything. And the broad flat middle is the same mechanism running the other way. Yes, everyone knows red means hot — but the convention rescues the two ends and nothing in between, since nothing tells a reader whether cyan outranks green or green outranks yellow, and that is where most of this map lives. Put the same ramp on latency, error, pressure or dollars and there is no convention left at all. One more reader to keep in mind: simulated for deuteranopia, jet’s per-degree spread widens from 37:1 to 40:1, and the distance between its green middle and its red end collapses from ΔE00 88 to 50. (Both drawings are ours, the facilities desk on the first is invented, and every temperature on both is real — ERA5-Land reanalysis values for the grid cell, which is to say model output rather than instrument readings from a weather station.)

03The fix

Let lightness carry the order, and the picture rights itself without a number moving. The same 288 cells on viridis run from L* 14.9 at the coldest to L* 90.9 at the hottest with lightness climbing the whole way, so not one of the 41,326 pairs is out of order, the summer block is the brightest thing on the page, and the ratio between the loudest degree and the quietest falls from 37:1 to 2:1 — the two cell pairs above land at 4.33 and 2.49 units of colour per degree instead of 18.08 and 0.51. For magnitude the general rule is one hue, light to dark, or a multi-hue ramp built so that lightness only ever climbs: viridis, cividis, magma, or the Scientific colour maps Crameri publishes and which he, Shephard and Heron argue for in their 2020 Nature Communications paper on the misuse of colour. Keep a diverging pair with a neutral middle for data with a real zero to diverge about, and never put a hue at the midpoint. In practice it is one argument: cmap="viridis" for cmap="jet", scale_fill_viridis_c() for scale_fill_gradientn(colours = rainbow(20)), d3.interpolateViridis for d3.interpolateRainbow. Then run two checks, ten seconds each, because they catch different things. Desaturate the finished picture, or print it: if the map stops making sense, the colours were carrying work the lightness was not. Then simulate colour-vision deficiency and look again — that is a separate test, not the same one, because a dichromat is not a monochromat: they keep a full blue–yellow axis, which is exactly why the deuteranope panel above renders jet in blues and yellows rather than in greys. Give the ramp the courtesies an axis gets: a legend with numbers on it, both ends labelled, and the name of the map in the caption the way you would print a unit, because a chart whose colour scale is a secret is a chart whose units are a secret. Where a specific level genuinely matters — a threshold, a setpoint, a limit — draw a labelled contour on it rather than hoping a colour boundary happens to land there, since a boundary the ramp invented will be read as one you meant. Three things this is not. It is not strategic binning: no bin edge was chosen here, the scale being continuous and linear throughout — binning is a decision about where to cut, this is about which colours the ramp hands out along the way. It is not a complaint about defaults, either: matplotlib has shipped viridis as its default since 2.0 and MATLAB parula since R2014b, so on that slide jet had to be typed. Where rainbows still arrive unasked is GIS packages, older ParaView, thermal-camera firmware, Excel’s three-colour scale and a few JavaScript libraries — and in every chart inherited from a colleague who typed it years ago. And it is not a case for banning rainbows. Where a rainbow accelerates it separates values a single-hue ramp would flatten, and readers are accurate at looking a single value up against a rainbow key — Ware, Stone and Szafir set that case out in IEEE Computer Graphics and Applications in 2023, sixteen years after Borland and Taylor’s “Rainbow Color Map (Still) Considered Harmful”. What a rainbow is poor at is the job this particular map is doing, which is ranking a whole field at a glance. Know which task you have. And do not assume a smoother rainbow settles it: measured over this same range, turbo is far smoother than jet, at a speed ratio of ×4.7 against ×37.0, but its lightness still turns over in the middle, and on this grid it puts 24,766 pairs in the wrong lightness order — more than jet does.