Exploratory spatial data analysis
A series of browser-based linked-view tools built with D3.js. Each
takes the brushing model from GeoDa — select features
in one view and watch them highlight in the others — and makes it work on the open web with no
install and no build step. All are data-agnostic: point the config file at your own GeoJSON and the
tool adapts.
A classified choropleth linked to a histogram of the mapped variable. Select features on the map to
see where they fall in the distribution, or brush a range in the histogram to see where those
features are. Quantile and equal-interval classification, 3–8 classes, 27 ColorBrewer palettes,
and a summary statistics panel comparing selection against full population.
Live demo
Source
Demo data: NYC census tracts, 2020
A 3×3 bivariate choropleth linked to a scatterplot with OLS regression. Selecting a subset draws
a second regression line for that subset, so its slope and correlation can be read directly against
the full population. Six bivariate color schemes adapted from
Joshua Stevens.
Live demo
Source
Demo data: NYC COVID-19 vaccination rates by MODZCTA, 2021
Two stacked choropleths with independent variables, palettes, and legends, sharing synchronized zoom
and pan, plus a scatterplot of one against the other. Selection in any of the three views propagates
to the other two.
Live demo
Source
Demo data: NYC COVID-19 vaccination rates by MODZCTA, 2021
A bivariate choropleth linked to a brushable scatterplot in which every scatter mark is the silhouette
of the state it represents, normalized so each encloses the same area. The map shows where, the
scatterplot shows how much, and the mark itself shows which — so Texas or Michigan is
identifiable in the scatter without a tooltip or a legend lookup. Deliberately narrow: it only works
for geographies whose outlines a reader already carries in their head.
Live demo
Source
US states
Cartographic experiments
Maps that argue something rather than serving as general-purpose tools.
All 435 congressional districts redrawn so every district is the shape of its own state —
district 1 a solid scaled copy, districts 2 through n nested rings around it, each holding an
equal share of the state's 2020 census population. A geometric thought experiment, not a redistricting
proposal. What it actually renders is a radial population-density profile: ring width is inverse
density, so New York's outermost districts come out roughly one-ninetieth the width of its innermost.
Live demo
Source
2020 census blocks (PL 94-171)
A dual-panel visualization pairing a force-directed network graph with a choropleth of the same
geography. Selecting a node re-colors the map by that node's edge weights, so the abstract topology
of the graph and the real geography it describes can be read against each other. The test case is
2025 NYC Citi Bike trips aggregated to Community District Tabulation Areas.
Live demo
Source
Citi Bike system data, 2025
Data visualization
The same D3 toolkit applied to non-spatial data.
An interactive timeline of college football team quality from 1869 to 2025, measured by Simple Rating
System score, with the data pipeline behind it. SRS rather than Elo because it is centered on each
season's mean by construction, which makes it comparable across eras without extra normalization.
The design owes an obvious debt to FiveThirtyEight's now-defunct Complete History of the NBA.
Live demo
Source
Sports-Reference/CFB, fetched via the Internet Archive
The age of every sitting senator on the day each Congress convened, 1789–2025 — the whole
chamber, not the incoming class, so a senator serving thirty years contributes fifteen observations at
fifteen different ages. Two layers share one count axis: a grey silhouette showing how the seats would
be distributed if the chamber were ordinary, and party-colored dots showing what it actually looked
like.
Live demo
Source
A Wilkinson dot plot of how old presidents were while they held the office. One dot is one president at
one integer age, with no sampling, so every president appears — including William Henry Harrison,
whose entire presidency is a single dot at 68. Within a column dots stack chronologically, so reading
bottom to top is reading forward in time.
Live demo
Source
A force-directed network of the Guardian's 2026 best-novels poll, with a node for every novel and every
voter and an edge for every vote cast. Edge length is weighted by ballot position, so critics with
orthodox taste pull toward the center while idiosyncratic ballots and niche novels drift to the edges.
Dashed edges connect novels appearing together on eight or more ballots.
Live demo
Source
Data compiled by Matthew Aldridge
Teaching and reference
Instructional material for researchers and students new to spatial data.
An interactive walk through fifteen geographies used for the Decennial Census and the ACS, built for
the Columbia University Libraries census research
guide and aimed at complete novices. Every step has its own URL fragment so a guide can link
straight to a single geography, hovering any unit decomposes its GEOID into labelled runs, and each
step states in words what it does and does not nest inside — because the census hierarchy is not
a clean tree and most introductions hide that. NYC-centric by design.
Live demo
Source
2020 vintage geometry