Curtis Kephart
Aug 20, 2026
A stacked ribbon: one band per group, stacked, running left to right over calendar years. A band’s height is that group’s deaths in that year; the stack’s height is their sum. Stacked rather than drawn as separate lines because in most views the groups partition the deaths, so every death sits in exactly one band.
Show picks the quantity, As picks how it is scaled, and the line under the controls says what the pair you have chosen means.
Deaths is who died. People is who was alive: the population behind each band rather than the deaths in it. That one is offered over age groups only, because a living population cannot be divided by cause of death. Everyone alive is at risk of every cause at once, so there is no honest way to hand each person to one band. Stacking by cause or by a cross-cutting group therefore drops the Show control entirely and the next one reads Show deaths as, since with one quantity left there is nothing to choose.
Count plots the numbers themselves. Share divides by the same quantity over the current filter: deaths by all deaths that year, people by everyone alive in the selected ages. The denominator is never just the bands on screen, so opening a chapter shows what its parts are worth against all mortality rather than against each other, and hiding a band does not reflate the rest to cover the gap.
Population here is Human Mortality Database exposure to risk: person-years lived at each single year of age, which is the same denominator every death rate on this page is divided by. It is not a headcount on one date. Someone born in July contributes half a year to that year, and so does someone who dies in July, so across a whole age band the number lands within a fraction of a percent of the population at mid-year. Reading it against 2020 gives 331.4 million, which is the census figure.
The reason to look is that a band of the deaths plot is large for two quite different reasons, and the plot alone cannot tell you which. The seventies and eighties bands are the tallest on the deaths stack partly because dying is likelier there, and partly because the baby boom is now standing in them. Switching to People shows the second half of that. The readout on hover carries both numbers and the death rate between them, so the comparison does not need two screenshots.
Stack by.
The Group menu has two sections. Cross-cutting groups take something the ICD files under several different headings and split it into disjoint parts: deaths of despair, external causes and firearms by intent, suicide and homicide by method, drug poisoning by intent, and motor vehicle. One at a time, because they overlap each other: a firearm suicide is in firearms, in suicide and in external causes at once.
Rare and unusual causes is the second section: nine collections of very thin series, from lightning and dog bites to helicopters and canoes. Three things work differently there, and the note under the plot repeats them as you select a group. There is no age dimension, so the Ages filter switches off. Nothing is smoothed. And they partition nothing, so there is no grey remainder band.
Opening a chapter. Underlined names in the legend open up. Inside one, the grey “Other” band is the parent minus the named parts, worked out year by year, so it stays correct in years before a part was separately coded. Firearms and drug poisoning are not offered inside External causes, because both cut across intent and would be counted twice; they have their own entries under Cross-cutting.
Hiding. Inside a group, and over age groups, click a name in the legend to hide its band. “Show all” brings them back.
ICD revision boundaries at 1968, 1979 and 1999, marked with a dashed line. Cause of death is coded to a classification that is renumbered every ten to twenty years, so a step at one of these years is often the classification changing rather than mortality. Narrow bands move at those years far more than whole chapters do.
The full reference is the composition ribbon notebook: every band, the ICD codes behind it, counts by year, and where these numbers check out against published figures and where they do not.
All-Cause Mortality data comes from the Human Mortality Database (mortality.org). 1933–2024 deaths and exposures. See the “all causes” reproducible notebook for details.
Mortality by Cause, the Multiple Cause-of-Death files, 1959 to 2024. Collected and published by the National Center for Health Statistics (NCHS), the CDC agency that runs the US vital statistics system, and read here from the NBER mirror, Mortality Data - Vital Statistics NCHS Multiple Cause of Death Data, which republishes the same files with named columns and some preprocessing. Data is abstracted from death certificates filed in vital statistics offices of each State and District of Columbia. Causes of death were coded according to the ICD codes, which were revised in 1968, 1979, & 1999. See the “by cause” reproducible notebook for details.
Based on work by The Economist, “Boomers have the good life, but it could be longer”, 17 July 2026. This article is based on “Insights into US life expectancy stagnation from birth cohort mortality dynamics”, by Abrams et al., 2026, PNAS 123(11), (doi:10.1073/pnas.2519356123). Authors’ OSF repo
Click “How to read this plot” and “About this plot” for guidance on reading the plot and added details about the data.
Each cell represents the annual change for each
year’s age-specific death rate:
-100 × (log m[a,t] − log m[a,t-1]), where
m[a,t] is deaths divided by person-years of exposure at age
a in year t. Positive Bright green means the rate fell.
Dark blue indicates a
worsening death rate, pale
indicates little change in the death rate. The sign is flipped from the
raw percentage change so that green reads as good, matching the
published legend.
Smoothing. Smoothed values come from a 2-D P-spline
(mgcv::bam, tensor-product Poisson), standing in for the
deprecated MortalitySmooth package used in Abrams et
al. Smoothing seems to be less useful where deaths are sparse and on
edges.
Color scale. Some plots are clipped at ±6%, to match the published figure being replicated. And the ramp is non-linear: it fades gradually through dark blue on the worsening side but saturates to full green within about two points of zero. Zoom (click and drag) to rescale out of that clipped scale.
The Composition tab shows stacked ribbon time series plots for various mortality causes.
Generations follow the Pew Research Center boundaries.
Wartime deaths appear to be largely absent. 1940-1969 US military overseas personnel are excluded from the dataset, and their deaths are ignored. HMD’s reference file for the United States records that the Census estimates covering 1940–69 were “adjusted by excluding Armed Forces Overseas” (refcodes 45, 71, 85, 125).
Read the wartime years cautiously, this removal also complicates the interpretation of other mortality statistics. Removing these men reduces the denominator used to calculate death rates for the remaining U.S. population. More importantly, military service is unlikely to be randomly distributed across the population, so their removal may be correlated with particular causes of mortality. As a result, changes in observed death rates may partly reflect changes in who remains in the population at risk, rather than changes in mortality risk alone.
This is a Lexis diagram, essentially a heatmap showing US mortality statistics for different ages over time.
Select the By cause tab to see the same plot for a number of the most common causes of death.
Select the Composition tab for a different question: not how mortality changed, but what people died of, and at what ages, as a share of all deaths in each year.
A cell holds everyone who was that age during that calendar year. For example, 64-year-olds in 2019. Hover any cell to see its age, year, birth year, death rate, and the number of deaths behind it.
On Change in mortality, color is the year-on-year change in that age’s death rate. Bright green cells are years when fewer people of that age died than the year before, meaning mortality fell. Dark blue cells are the opposite: more people of that age died than the year before. Pale cells in the middle are years of little change either way.
Switch Measure to Death rate and color shows the level instead: deaths per 1,000 people that year on the All causes tab, per 100,000 by cause.
Reading straight up a column shows what a single year did to every age at once. Something that strikes all ages together leaves a vertical stripe. For example, COVID-19 starting 2020.
Reading along a row follows one age through time. Each cell compares that age with the same age the year before (not with the same people a year younger). For example, select 70-year-olds and note how this age has generally improved its mortality statistics each year until 2020.
Life expectancy for a specific age and year is built from the death rates at that age, and every age above. That is, the stretch of column running up from that age-row.
Because one year of time is also one year of age, a single birth-year cohort runs along the diagonal. Following a diagonal follows the same group of people as they age. Use Generation highlight to focus on standard age cohorts.
Some features worth noticing span several ages and years at once. The AIDS epidemic shows up as a band of worsening at young adult ages through the 1980s and early 1990s that reverses sharply after 1996. COVID-19, starting in 2020, is a vertical stripe striking every age in the same year, with dramatic improvements following the release of vaccines and broad immunity.
This tab asks a different question from the Lexis plot: not how mortality changed, but what people died of. The two can point opposite ways at once, because a cause whose death rate is falling can still take a growing share if the causes around it are falling faster.
Stack by cause starts with twelve top-level groups plus a residual, which between them account for every death in the file. Names in the legend that are underlined can be opened up: click one, or click its band, to see the sub-causes inside it. The grey “Other” band that appears is whatever the named sub-causes do not account for, worked out year by year, so it fills in correctly even in the years before a sub-cause was separately coded.
Stack by age does the same with age groups instead, in decades, in twenty-year groups, or by generation. Generations are bands of birth years rather than of ages, so the slice of the age range each one covers moves up by one every calendar year. Watching a generation swell and then fade is watching a cohort age.
Stack by cross-cutting opens the Group menu, which holds two kinds of thing. Cross-cutting groups split something the ICD files under several headings, like deaths of despair or firearms by intent. Below them sit the rare and unusual causes, nine collections of very thin series running from lightning and dog bites to helicopters and canoes.
As switches between counts and share. Under Share, each band is a share of all deaths rather than of whatever is on screen, so inside a group the stack stops at what that group is worth against total mortality instead of being stretched to fill the height. Opening cancer shows lung cancer at about 4% of all American deaths, not at 21% of cancer deaths. Click a name in the legend to hide its band, and “Show all” to bring everything back.
Show appears over age groups, and switches between the deaths and the people behind them. It answers the question the deaths plot cannot: a decade band is tall partly because dying is likelier at that age and partly because more people are standing there. Hover any band to get both numbers and the death rate between them. It is not offered on the other two stacks, because the living cannot be divided by cause of death.
Use the Years and Ages filters to ask the same question of a narrower slice. Filtering ages does not just crop the picture, it changes it: the leading cause of death among 25 to 44 year olds is not the leading cause overall. The rare causes have no age dimension, so the Ages filter switches itself off while one of them is selected.
On a desktop, click-and-drag a box across the plot to zoom into a range of years and ages. The color scale refits to whatever is inside the box, so detail that the full range flattens out becomes visible.