Sixteen ways to draw the GitHub Innovation Graph: six years of developers,
repositories, languages, licenses and cross-border collaboration for every economy on
GitHub, each option drawn live from the real data.
Source GitHub Innovation Graph (github.com/github/innovationgraph), CC0-1.0, downloaded 2026-08-18 Filesdevelopers.csv economy_collaborators.csv git_pushes.csv languages.csv
licenses.csv organizations.csv repositories.csv topics.csv · 8 files, 386,944 rows total Method Every number on this page was measured from the files by prep.py.
The datameasured, not assumed
Grain: one economy-quarter measurement. Four files carry one
metric per economy per quarter (developers, repositories, organizations, git pushes); three
break a quarter down by a category (language, license, topic); one is an edge list between
economies. 25 quarters, 2020 Q1 through 2026 Q1.
Three traps that constrain every option below
The iso2 column contains both countries and the EU aggregate. "EU" sits
beside DE, FR and the other member states, so summing the column double counts Europe. Every
total on this page excludes the EU row and says so.
Everything is censored below 101. The smallest value in any long table is
exactly 101: GitHub suppresses small cells. An absent row means "under 101 or zero", never
"zero". "NA" is Namibia, not a missing value; a default pandas read silently
deletes the country. prep.py reads with NA-parsing off.
Column
Role
Card.
Null
Range / notes
iso2_code
geographic
230
0%
ISO 3166-1 alpha-2 plus the EU aggregate; includes territories (HK, PR, RE ...)
year, quarter
temporal
25
0%
2020 Q1 to 2026 Q1, complete quarterly grid; 2026 has Q1 only
developers
quantitative
—
0%
101 to 32,410,529 (US, 2026 Q1); heavily right skewed
repositories
quantitative
—
0%
tracks developers at roughly one repo per developer (see C5)
organizations
quantitative
—
0%
slowest growing of the four measures
git_pushes
quantitative
—
0%
fastest moving; volume, not head count
source, destination
relational
216 × 205
0%
economy pairs; 4,155 directed edges in 2026 Q1 alone; no self loops
weight
quantitative
—
0%
collaboration count per pair-quarter, as published; min 101 (censored)
language
nominal
404
0%
far past any palette; color only after aggregation
language_type
nominal
4
0%
programming / markup / data / prose; fits categorical color
spdx_license
nominal
30
0%
MIT holds half; NOASSERTION means "no license detected"
topic
nominal
1,947
0%
only 132 economies ever appear: the long tail is truncated upstream
num_pushers
quantitative
—
0%
developers pushing that language/license/topic, per economy-quarter
The four measures, world total excluding the EU row, indexed to 2020 Q1 = 100
Developers grew 4.2x in six years, git pushes 4.0x, repositories 3.5x, organizations 2.7x.
Head count is outrunning institutions: the average economy adds developers faster than it adds
organizations, which is worth remembering under every per-economy chart below.
Rules IN: nearly everything. This dataset natively carries four shapes at
once: time series per economy (multi-line, index, race), geography (choropleth, spike map),
categorical composition (stacked areas, treemap, slope) and a real weighted directed network
(chord, matrix, arc). That breadth is why this page has sixteen options rather than three.
Rules OUT, hard: anything needing sub-quarterly time (calendar heatmaps,
weekday cycles); per-capita or per-GDP normalization (no population or GDP column: joining one
is a data project, named in the rejected list); hierarchy deeper than two levels (language_type
→ language is the only real containment); and any chart of the raw 216-node network at
once (a hairball past ~150 nodes).
The edge list is the one shape no other public developer dataset has, and the chord is
the strongest thing this data can say: the US sits at the center of world code
collaboration, and the 12 largest economies carry 36.6% of all cross-border weight.
Build it first because it is the headline and because it exercises the hardest data path
(the matrix pivot) that A6 and X4 then reuse.
Absolute lines (C1) show the US on top forever; indexing to 2020 Q1 = 100 flips the
story to the one that matters: India grew 6.4x against the US 3.3x and is on course to be
the largest developer economy. One transform, a different headline. Cheap to build once C1
exists.
The same overtaking story as A2, spent as motion for a presentation audience: India
passes economy after economy quarter by quarter. It earns its animation because rank
changes are the subject, and the scrubber keeps it honest. Build it last; it is the demo,
not the analysis.
Conventional5
What a competent analyst draws in the first hour. C1 and C2 are also the
sanity checks every later option is read against.
C1
Developers over time, top 8 economies
multi-series line chart
How many developers does each big economy have, and how has that changed since 2020?
Quarterly developer counts, top 8 economies by 2026 Q1, EU aggregate excluded
The US leads throughout, but the gap to India collapses from 2.3x in 2020 to 1.2x by 2026 Q1;
India passed China at 2022 Q1 and every other economy reads as flat at this scale, which is
exactly the weakness A2 fixes.
Encoding
x = quarter (25 steps), y = developers (linear), color = economy (8 categorical hues), direct labels at line ends
Why this data
A complete 25-quarter grid with no gaps for the top economies; 8 series is the ceiling of a categorical palette, and the top 8 hold most of the world total
Color
Categorical, one hue per economy, direct-labeled so no legend lookup; same hue per economy reused across C1, A2 and X1
Interaction
Hover any point for the exact economy-quarter count; the answer to "what exactly was India in 2023 Q2"
Exemplar
multi-lineline-with-tooltip
Failure mode
Below about rank 5 the lines flatten into an unreadable braid at the bottom: absolute scale hides everything but the top 3. It also invites summing the 8 lines into "the world", which the EU row and the censoring both make wrong.
C2
Top 20 economies, latest quarter
ranked horizontal bar
Who are the biggest developer economies right now?
Developers per economy, 2026 Q1, sorted; India highlighted The top 10
economies hold 56.7% of the 192,326,991 ex-EU world total. The list is the page's reference
ranking: US, India, China, then Brazil ahead of the UK, Japan and Germany.
Encoding
y = economy (ranked), x = developers (linear length), value labels at bar ends; India in the warm accent, all else in the primary green
Why this data
1 Q × 1 N(230) at a single quarter is the canonical bar shape; long economy names need the horizontal variant; sorting by value is the insight
Color
One hue plus a single warm highlight for the subject (India, the mover). Twenty equally loud colors would have no subject
Interaction
Hover for exact count and share of world total, which the bar length alone cannot give
Exemplar
horizontal-barbar
Failure mode
A single-quarter snapshot silently claims stability: this exact chart drawn in 2020 would rank China 2nd and leave Indonesia out of the top 10 entirely. Cropping to 20 also hides that the tail continues for 200 more economies. Pair it with A2 or X1 before concluding anything about trajectory.
C3
World developer choropleth
choropleth map, log ramp
Where in the world are GitHub developers?
Developers per economy, 2026 Q1, log color ramp on a 50m basemap Coverage
is the finding: nearly every polygon on earth shades in, and the log ramp is the only reason
the map is not one dark US/India/China blob on a pale field. Unmapped economies are computed
and listed under the map, not hand-written.
Encoding
Polygon = economy (iso2 joined to ISO numeric), fill = log10(developers) on the sequential green ramp, explicit no-data fill for censored or absent economies
Why this data
230 iso2 codes is a genuinely geographic column; values span 101 to 32.4M, five orders of magnitude, which forces the log ramp
Color
Sequential green ramp (contribution-graph association), log transformed; no-data gets its own neutral fill, never the lightest ramp step
Interaction
Hover any country for its exact count or its censoring status; the map answers "where", the tooltip answers "how much"
Exemplar
world-choroplethchoropleth
Failure mode
A raw-count choropleth is mostly a population map: India dark and Iceland pale says people, not programming. Without population on board (see rejected list) this map cannot say "density". Microstates with big developer counts (Singapore, rank 22) are near-invisible polygons; the 50m basemap drops some entirely.
C4
Language pushers, stacked over time
stacked area chart
Which languages do developers actually push, and is the mix changing?
Worldwide pushers by language per quarter, top 8 languages plus Other, EU
excluded The stack quadruples in height while its proportions barely move: HTML, JavaScript
and CSS stay the top three the entire window. The one visible mix shift is TypeScript's wedge
widening from 2022 on, the same movement A3 isolates.
Encoding
x = quarter, y = sum of pushers stacked by language (top 8 by 2026 Q1 + Other), color = language
Why this data
num_pushers sums to a meaningful whole per quarter (pushers of anything), which is the precondition stacking requires; 404 languages compress to 8 + Other to fit a palette
Color
Categorical for the 8 named languages; Other in the no-data neutral so the aggregate reads as background, not as a ninth language
Interaction
Hover anywhere in a band for that language's count and share at that quarter, which stacking otherwise makes unreadable above the first band
Exemplar
stacked-areaus-population-by-state
Failure mode
Only the bottom band sits on a straight baseline; every other language's shape is distorted by the bands beneath it, so mid-stack trends (Java's decline) are nearly invisible. A pusher of three languages is counted three times, so the stack total is pushes-of-languages, not people.
C5
Repositories vs developers, every economy
log-log scatterplot
Do economies with more developers also have proportionally more repositories, or do some punch above their weight?
228 economies at 2026 Q1, log-log, with the 1:1 reference line The cloud
runs parallel to the one-repo-per-developer diagonal across five orders of magnitude, offset
to roughly 2 to 3 repositories per developer: repo creation scales almost linearly with head
count, and the residual spread around that corridor is the per-economy question the tooltip
answers.
Encoding
x = repositories (log), y = developers (log), one point per economy, y = x reference line, labels on the 7 largest
Why this data
Two quantitative measures on the same economy-quarter grain; both right-skewed over 5 decades, so only log-log shows the 228 points as a shape rather than a corner clump
Color
Single hue at 55% opacity; the encoding channels are the two positions, and 228 categorical colors is not color
Interaction
Hover any dot for the economy, both counts and the repos-per-developer ratio; the ratio is the residual the chart is really about
Exemplar
scatterplothr-diagram
Failure mode
Log-log axes make everything look correlated; the same data on linear axes is one dense corner plus three outliers. The tight fit here partly restates that both columns measure the same underlying activity, so causal readings ("more devs create more repos") are circular.
Analytical6
A transform earns each chart: a matrix pivot, an index, ranks, a moved
baseline, shares, and a reorder. This band is where the dataset's actual headlines live.
01 · A1
Cross-border collaboration chord
directed chord diagram, 25 quarters
Which economies' developers actually work together, who is the hub, and has that changed since 2020?
Directed collaboration flows among the 12 largest developer economies, one ring
per quarter from 2020 Q1 to 2026 Q1, EU aggregate excluded Drawn, the ring is not a mesh:
it is a hub, in every one of the 25 quarters. Nearly every large ribbon lands on the US arc
throughout; what the progression adds is the India arc visibly widening while these 12
economies' share of all cross-border weight falls from 41.3% in 2020 Q1 to 36.6% in 2026 Q1
(the computed line under the ring updates per quarter): collaboration is spreading beyond the
big twelve. Ribbons sweep in region by region on load; the transport scrubs, plays, replays or
loops the quarters.
Encoding
Arc = economy (length = total flow), ribbon = source → destination weight with an arrowed end, color = source economy, frame = quarter with ribbons tweening between layouts; transform: pivot each quarter's edge list into a 12 × 12 matrix, 25 matrices in all, fixed economy set for object constancy
Why this data
A real weighted directed edge list per quarter, the dataset's rarest asset; 12 groups is inside the chord readability ceiling, and the fixed top-12 crop carries 36.6% to 41.3% of total weight depending on the quarter, stated live on the page
Color
Categorical per economy, ribbons inherit the source hue at 68% opacity so outbound flow reads at a glance; the 4 beyond the 8-hue palette get brightened variants, defensible only because arcs are direct-labeled
Interaction
Full transport: play/pause, scrub, replay, loop. Hover an arc to isolate that economy's ribbons and read its totals; hover a ribbon for both directions of the pair (the asymmetry is invisible in ribbon width alone)
Exemplar
directed-chordchordchord-labelled
Failure mode
The 12-economy crop deletes roughly 60% of cross-border weight, and a reader who misses the caption reads the ring as the whole world. Past ~15 groups the ribbons occlude into mud, so this chart cannot grow; the matrix (A6) is its scaling path. Ribbons that cross the censoring threshold between quarters appear and vanish rather than shrink, and the tween cannot distinguish the two.
02 · A2
Developer growth, indexed to 2020 Q1 = 100
index chart
Who is growing fastest, regardless of size?
Top 10 economies, indexed to their own 2020 Q1 count, with an absolute-scale
toggle The indexed view answers "who is growing fastest": the absolute ranking inverts,
India (6.4x) and Brazil lead, the US (3.3x) sits mid-pack, and China (1.9x) is last among the
ten. The absolute view (log scale) answers "who is biggest while they grow", and is the view
in which India's line visibly closes on the US. Lines draw on fastest-grower-first;
the replay button reruns the reveal.
Encoding
x = quarter, y = developers / own 2020 Q1 value × 100 (toggle: raw developers on a log scale), color = economy, dashed 100 baseline in the indexed view, India's line weighted heavier; transform: per-series normalization
Why this data
Series spanning 32.4M (US) down to 4M (France) differ 8x in level, exactly the condition indexing exists for; every top-10 economy has a nonzero 2020 Q1 base, so the index is well-defined, and the log scale keeps the smallest series visible in the absolute view
Color
Same categorical hue per economy as C1 so the two charts cross-read; the subject (India) carries the visual weight via stroke width, not a louder color
Interaction
A view toggle between indexed and absolute, each answering a different question; hover any point for both the multiple and the raw count at that quarter; a replay button for the staggered draw-on reveal
Exemplar
index-chartchange-line
Failure mode
Indexing worships the base period: an economy that had a bad 2020 Q1 gets a flattering curve forever. It also hides scale entirely; Nigeria at 10.3x (below this top-10 cut) reads as "beating" the US while being 18x smaller. Always pair with C1 or C2.
A3
Language rank, quarter by quarter
bump chart, 25 quarters
Which languages rose or fell over the six years, and what path did they take?
Global pusher rank per quarter, 2020 Q1 to 2026 Q1, top 15 languages of 2026;
scrub to reveal The endpoint verdicts hold: the top four (HTML, JavaScript, CSS, Python)
never move, TypeScript climbs 13th to 5th, Jupyter Notebook 15th to 10th, while Java (6th to
8th) and PHP (10th to 15th) slide. What the path adds is a correction the two-endpoint slope
chart hid: SCSS did not "rise from nowhere". It burst to 7th within a year of entering, and
has been sliding ever since, down to 14th. Line color still encodes the endpoint verdict.
Encoding
x = quarter, y = rank among ALL 404 languages that quarter (1 at top), one bump line per language, scrub position = how much of the path is revealed; color = endpoint direction (green up, orange down, grey flat, purple dashed = below threshold in 2020 Q1); left labels pin the 2020 Q1 ranks, right labels track the revealed end; transform: rank within every quarter, 25 rankings
Why this data
A complete quarterly grid makes the full rank path drawable, not just its endpoints; ranks absorb the 4.2x overall growth that would otherwise drown mix changes, and the top-15 crop keeps every label legible
Color
Three-state direction coding on the diverging pair plus neutral; direction is the message, so color goes to direction rather than to language identity
Interaction
Full transport: play/pause, scrub both ways, replay, loop. Hover a dot for that language's exact rank and pusher count in the shown quarter; hover a line for its endpoint verdict
Exemplar
none in corpus for bump chartsslopemulti-line
Failure mode
Rank lines cross constantly in the lower half, where single-position moves are noise between near-tied languages; the eye reads every crossing as an event. Ranks also compress unevenly; the 5th-to-6th gap may be millions of pushers while 12th-to-15th is noise. The counts in the tooltips are the guard.
A4
Year-over-year growth vs the world rate
diverging bar chart
Which big economies are gaining or losing ground on the world right now?
YoY developer growth, 2025 Q1 to 2026 Q1, top 30 economies, baseline
toggleable Drawn against zero this chart embarrassed itself: every one of the 30 grew, so
"diverging" had no negative side. The honest baseline is the world's own +30.7%, against which
Pakistan (+45.3%), Egypt and Singapore lead, and China (+9.3%), Russia and Ukraine fall
furthest behind. Toggling tweens every bar to the new baseline, so the eye tracks each economy
across the shift; on load the baseline draws first and the bars grow out of it.
Encoding
y = economy sorted by growth, x = YoY growth minus the chosen baseline (zero or world +30.7%), bar direction and diverging color = above/below baseline; transform: same-quarter-last-year rate, then a baseline shift
Why this data
Same-quarter comparison sidesteps any seasonality; a meaningful reference (the world rate, computed ex-EU) exists in the data itself, which is what a diverging encoding requires to be honest
Color
The purple/orange diverging pair around a neutral midpoint, poles anchored to the baseline, magnitude mapped symmetrically so +10 and -10 are equally saturated
Interaction
The baseline toggle is the analysis: "is everyone growing?" (zero) vs "who is gaining share?" (world), and the bars tween between the two so each economy keeps its identity across the shift. Hover for the raw rate, count and the world rate; a replay button reruns the baseline-first reveal
Exemplar
diverging-barmethods-of-comparison
Failure mode
One year of growth is noisy for smaller economies, and the +30.7% world rate is itself dragged by India's bulk, so "below world" mostly means "slower than India". Diverging around a mean-like reference also changes the picture whenever the reference is recomputed; the zero toggle exists as the stable fallback.
A5
License share of pushers over time
normalized stacked area
Is open source consolidating on permissive licenses?
Share of license-classified pushers per quarter, top 6 licenses plus Other,
EU excluded Yes, and by a familiar name: MIT rises from 44.9% to 50.1% of all license
pushes, GPL-3.0 falls 11.6% to 9.3%, and NOASSERTION (no detectable license) shrinks 16.6% to
13.8%. The one countertrend is AGPL-3.0 doubling from 1.4% to 3.2%.
Encoding
x = quarter, y = share of that quarter's total pushers, stacked by license (top 6 + Other), color = license; transform: per-quarter normalization to 100%
Why this data
30 licenses collapse cleanly to 6 + Other (the 6 hold ~93% of weight in 2026 Q1); the question is composition, not volume, so the 4x growth in the total is deliberately suppressed
Color
Categorical for named licenses; NOASSERTION in grey because it is an absence, not a license, and coloring it like one would misread as a "license" gaining share
Interaction
Hover a band at any quarter for the exact share; shares of mid-stack bands are unreadable from the axis by construction
Normalizing hides that the denominator quadrupled: GPL's falling share is still a growing absolute count, and a reader will quote "GPL is dying" from a chart that does not show that. Licenses below the 101 threshold per economy are censored before the shares are computed, biasing Other downward.
A6
Collaboration adjacency matrix, top 20
reorderable adjacency matrix
Where are the holes: which large economies barely collaborate at all?
Directed weights among the 20 largest economies, 2026 Q1, log ramp, two
orderings The chord shows the hub; the matrix shows the holes. The US row and column are
solid; the censored-empty cells (computed live in the legend) concentrate away from the US
axis, in pairs of mid-size economies. Reordering by collaboration weight pulls the UK, Germany
and Canada above bigger-population economies, the matrix's own quiet finding; the reorder
tweens every cell to its new position so the blocks visibly reassemble. Cells fade in as a
diagonal wave on load.
Encoding
Row = source, column = destination, cell fill = log10(weight) on the sequential ramp; structural gaps get the no-data fill, the diagonal (unpublished self-pairs) its own surface tone; transform: edge list to 20 × 20 matrix
Why this data
At 20 nodes the same data is already too dense for readable ribbons; a matrix has no occlusion at any density, and this one is where the censoring pattern (which pairs are missing) becomes visible at all
Color
Sequential green log ramp for magnitude; explicit no-data fill for below-threshold pairs so censoring never masquerades as the ramp's lightest step
Interaction
The order toggle (by developer count vs by collaboration weight) is the seriation move, and the rows and columns tween to their new slots so the reordering itself is watchable. Hover any cell for the pair and weight; a replay button reruns the diagonal-wave reveal
Exemplar
none in corpus for adjacency matricesarc-diagramchord
Failure mode
Matrices read as texture, not as flows: no reader will trace a path through one, and asymmetry (row vs column) takes deliberate effort to see. The log ramp compresses the US column's dominance to a visual whisper; the linear truth is that one column holds most of the ink.
Creative / abstract5
Encodings that reward attention. Each one names what it trades away; the two
that spend animation spend it on rank change and on time itself, the two subjects motion is
for.
03 · X1
Developer bar chart race
animated ranked bars, 25 frames
Play me the six years: who overtook whom, and when?
Top 10 economies per quarter, 2020 Q1 to 2026 Q1; opens on the final frame,
plays on demand The race distills to three moves worth watching for: India passing China
at 2022 Q1, Brazil climbing into 4th, and Indonesia rising from outside the top 10 to 7th as
Russia slides to 9th. The first frame already carries the 2026 answer, so the animation is
replay, not reveal.
Encoding
y = rank (top 10 shown), x = developers that quarter, bar identity = economy with a stable hue, frame = quarter; transform: per-quarter re-ranking over the 13 economies that ever enter the top 12
Why this data
25 evenly spaced frames with real rank churn (13 economies rotate through the top 10); a race with no overtakes is a slideshow, and this one has overtakes
Color
Stable categorical hue per economy across all frames; object constancy is the entire mechanism, so color identity must never change mid-race
Interaction
Full transport: play/pause, scrub over all 25 quarters, replay, and an opt-in loop toggle; autoplay is off, the final state is the landing view, and reduced-motion preference drops the tweens entirely. The oversized quarter ticker is the narrative anchor
Exemplar
bar-chart-racebar-transitions
Failure mode
Races reward volatility, and this data is mostly stable: the top 5 reshuffles in only 2 of the 24 quarter-to-quarter steps, so the honest cut of this video is short. Between-frame interpolation also invents developer counts that never existed on quarter boundaries; the scrubber snaps to real quarters as the guard.
X2
Repos-vs-developers trajectories
connected scatterplot
As economies grow, do they follow the same path through repo-space, or different ones?
25-quarter trajectories for the US, India, China, Brazil and Nigeria, log-log,
year dots enlarged Four of the five ride the diagonal corridor northeast: the US slides
from 3.1 to 2.4 repositories per developer while India climbs from 2.2 to 2.6, converging on
the corridor's center. The exception is the finding: China's path knots and doubles back,
because its repository count peaked in 2021 and has fallen since even as its developer count
grew. No other chart on this page shows that.
Encoding
x = repositories (log), y = developers (log), one polyline per economy through its 25 quarterly points, enlarged dots at Q1s, label at the 2026 end, "2020" tag at the start
Why this data
Two quantitative measures moving together over the same 25-step clock is the connected scatter's exact home; five series is the readability ceiling for crossing paths
Color
Categorical per economy, direct-labeled at the trajectory head so the eye follows the path, not a legend
Interaction
Hover any vertex for economy, quarter and both counts, turning the abstract path back into checkable numbers
Exemplar
connected-scatterplotwealth-health
Failure mode
Connected scatters are the hardest common chart to decode: time is nowhere on an axis, and readers reflexively read the line left-to-right as if x were time. Doubling back is both this chart's power and its trap: China's knot is the page's most interesting path, and also the exact spot a reader will misread without the hover dots.
X3
The language landscape, quarter by quarter
animated two-level treemap, 25 quarters
What does the whole language ecosystem look like in one glance, and how has the landscape shifted since 2020?
Pushers by language type, then language, animated across 25 quarters; a fixed
set of cells (top 28 languages of 2026 Q1 plus one aggregate per type) tweens between
layouts In 2026 Q1, programming code is 66% of what gets pushed and markup (HTML, CSS,
SCSS, and GitHub classifies Jupyter Notebook here too) is a full third; the data and prose
types are computed slivers at 0.2% combined. Played, the landscape is remarkably stable;
the visible motion is TypeScript's cell swelling inside the programming block. Color is a
measured quantity here: languages pushed by the same economies sit at nearby hues, and the
measure recovers the web stack (HTML, CSS, JavaScript, TypeScript adjacent), C beside C++,
and a mobile cluster (Java, Kotlin, Swift, Objective-C, Dart) without being told any of it;
its one surprise is Makefile beside Lua. Each cell keeps one fixed color for all 25 quarters,
so growth reads as area change, never as a color change.
Encoding
Nested rectangles: outer = language_type, inner = language, area = pushers in the shown quarter, frame = quarter with cells tweening between layouts; fill = measured co-usage similarity (hue = position in a 2D embedding of economy-vector cosine similarity, chroma = distinctiveness of a language's geography), fixed per cell; long tail as an explicit "other" cell per type in neutral gray; transform: fixed 32-cell set, 25 values per cell
Why this data
language_type → language is the dataset's only true hierarchy, and the complete quarterly grid makes the layout animatable; a fixed cell set is what keeps cells trackable across frames, at the stated cost that a language outside 2026's top 28 never appears
Color
Color proximity encodes measured co-usage, computed from this dataset in prep.py: each of the 28 named languages gets a vector of num_pushers per economy from languages.csv (ex-EU, pooled across all 25 quarters), L2-normalized; pairwise cosine similarity is embedded to 2D by classical MDS (numpy eigendecomposition of the double-centered distance matrix), then angle around the embedding centroid maps to hue and distance from it to chroma, at a fixed lightness that reads on both themes. Measured angles are blended 50/50 with a uniform circular ranking so wheel neighbors stay at least 6.4 degrees apart while the measured ordering is preserved. Colors are computed once and frozen, so cells never change color mid-tween. Aggregate cells in the no-data neutral. Stack Overflow's correlated-technologies network is the canonical form of this measure but was deliberately NOT used: it is ODbL, and share-alike licensing is incompatible with embedding it in this report. A legend row shows the closest measured pairs and states the system
Interaction
Full transport: play/pause, scrub, replay, loop. Hover any cell for language, type, count and share in the shown quarter; cells wide enough carry their share inline beside the name, labels render only where they fit, so the tooltip is the guarantee of access to small cells
Exemplar
animated-treemaptreemapnested-treemap
Failure mode
Area comparison is weak past about 3:1, and an animated treemap makes it worse: cells move AND resize at once, so mid-play judgments are impressions, not readings. The fixed cell set also freezes 2026's winners into the frame; a language that mattered in 2021 but fell out of the top 28 by 2026 is invisible for the whole run. Pause and hover before quoting any number.
X4
Collaboration arcs, grouped by region
arc diagram, region-ordered
Is collaboration regional, or does everything route through the same few hubs regardless of geography?
Strongest 90 undirected links among the top 30 economies, 2026 Q1, nodes
ordered by region then size Ordering is the argument: if collaboration were regional, ink
would pool inside each region's block. Instead the tall gray cross-region arcs into the US
dwarf every within-region arc except Europe's own cluster, so the answer is "hubs, with a
European exception". Read the arcs by the two-swatch key below the chart: a colored arc joins
two economies in the same region, a gray arc crosses regions. On load the nodes land along the
baseline first, then the arcs rise region by region, gray last.
Encoding
x = economy ordered by region then developer count, node size = developers, arc thickness = summed two-way weight, arc color = region if both ends match else gray; transform: collapse directions, keep the strongest 90 of the within-top-30 edges
Why this data
An arc diagram is the one network layout where ordering carries meaning, and region is a real grouping the force layout would scramble; 30 labeled nodes stay legible on a line where they would overlap in a ring
Color
Five region hues for within-region arcs and nodes; cross-region arcs are gray as a deliberate category of their own, dimmer than the region hues so the regional/global contrast is the first thing seen, and spelled out in a dedicated two-swatch legend line
Interaction
Click a region name in the control row to isolate every arc touching that region; hover a node to isolate its own arcs (the "who does Brazil work with" question); hover an arc for the pair's combined weight; a replay button reruns the nodes-then-arcs reveal
Exemplar
arc-diagrammobile-patent-suits
Failure mode
Arc height encodes distance along the axis, not weight, and readers reliably misread tall as strong. The 90-edge crop and the direction collapse both discard structure (asymmetric pairs vanish), and a different region ordering would move the visual pooling; the ordering is an argument, and arguments can be rigged.
X5
Developers as spikes on the globe
spike map, 25 quarters
Can the sheer inequality of where developers are, and how fast the ground is rising, be felt in one image?
Spike height = square root of the developer count at each economy's centroid,
animated across 25 quarters on a scale fixed at the all-quarter maximum Where the
choropleth's log ramp deliberately flattens the range so small economies stay visible, the
spike map does the opposite: even under a square root, the US, India and China spikes tower
over continents of near-flat ground, and Africa reads as a plain with a single Nigerian
spike. Played from 2020, the whole field of spikes grows together while India's visibly
outpaces everything, the walmarts-growth move applied to a planet.
Encoding
Position = polygon centroid, spike height = sqrt(developers) on a scale fixed at the all-quarter maximum (110px = 32.4M), frame = quarter with spike heights tweening; constant width; countries drawn as a quiet basemap beneath
Why this data
A five-orders-of-magnitude geographic quantity is exactly where choropleth lightness saturates; length is the one channel that stays readable across that range, sqrt keeps the tail visible, and the fixed scale is what makes growth across quarters honest instead of renormalized away
Color
Single warm hue on a neutral basemap: one variable, one hue, and the warm-on-green contrast survives both themes; magnitude lives in length, not in color
Interaction
Full transport: play/pause, scrub, replay, loop. Hover a spike for the economy and its exact count in the shown quarter; centroid spikes for small mapped economies are otherwise sub-pixel
Exemplar
spike-mapwalmarts-growthbubble-map
Failure mode
Spikes at centroids overlap in dense regions (western Europe is a picket fence) and misplace island states whose centroid falls in the sea. The sqrt compression it needs to stay drawable also means spike height is not proportional to the value, and the animation compounds it: a doubling reads as a 41% height change. The tooltip carries the true numbers.
Considered and rejectedwith reasons
Option
Why not
Force-directed network of all economies
192 connected economies in 2026 Q1 alone is a hairball that looks like insight; past ~150 nodes the layout carries no information. The chord (A1), matrix (A6) and arc (X4) are the honest crops.
Sankey of collaboration
Sankey wants a staged, conserved flow; collaboration edges are a symmetric-ish exchange with no stages and no conservation, so the layout's core promise would be a lie.
Per-capita choropleth
The right map, and undrawable from this data: there is no population column. Joining UN population by iso2 is a named transform and a worthwhile project, but an option whose input does not exist yet is not an option.
Pie / donut of languages
404 categories, and even the top 8 differ by ratios a pie cannot convey. C4 and X3 answer the same question with position and area.
Calendar heatmap of pushes
The grain is quarterly; a calendar exposes weekday and daily structure this dataset simply does not carry.
Word cloud of topics
1,947 topics tempt it, but occlusion layouts are weak for comparison and the topic file covers only 132 economies. If topics matter, frequency bars on a filtered subset beat it.
Streamgraph of languages
The wiggle baseline distorts exactly the mid-stack trends (Java, PHP) a reader would want; C4's zero baseline plus A3's ranks cover both halves of the question honestly.
Language bar chart race
Measured, the race is dead air: the top 4 languages hold identical ranks at both endpoints (A3). A race without overtakes is a slideshow; the slope chart shows the same thing for free.
Animated wealth-health bubble chart
Redundant with X2: the same trajectories, but requiring playback to see what the connected scatter shows in one static frame. When paths do not cross, animation buys nothing.
Bivariate choropleth (developers × growth)
Drawable, but a bivariate legend spends the reader's whole budget on decoding while the univariate pair C3 + A4 answers both questions separately and faster.
Notes on the datawhat changes what is drawable
"NA" is Namibia. A default pandas.read_csv parses Namibia's
iso2 code as NaN and deletes the country: 25 rows, one per quarter, in each metrics file.
Every read in prep.py disables NA-parsing. If a rebuild of this page loses
Namibia, that is the first thing to check.
The EU row is an aggregate living inside a country column. It coexists
with all its member states, so any groupby-sum over iso2 double counts Europe. All world
totals here exclude it; the collaboration charts drop its 2,007 source edges and its
destination edges too.
Censoring at 101, everywhere. The minimum value across languages, topics,
licenses and collaboration weights is exactly 101. Absence means "below threshold", not zero:
the matrix's empty cells, the slope chart's missing SCSS endpoint and every "no data" map fill
are censoring artifacts, and each chart labels them as such rather than drawing them at zero.
The window is ragged at the right edge. 2026 contains only Q1, so
"latest year" aggregations silently compare 3 months against 12. Every chart here works on
quarters, and the YoY chart (A4) compares Q1 against Q1.
Category coverage shrinks down-file. Languages cover 184 economies,
licenses 150, topics 132 (of 230): the categorical files only include economies clearing the
threshold, so "global" language shares are really "economies-above-threshold" shares.
Geography has seams. Kosovo (XK) has no ISO numeric id and cannot join
the basemap. Several small economies have no polygon at 50m resolution; the choropleth
computes and lists them live rather than hiding them. Territories (HK, PR, RE) are separate
economies here but may be visually absorbed into parent polygons a reader expects.
The animated charts run on fixed member sets, chosen at 2026 Q1. The
chord's 12 economies, the bump chart's 15 languages and the treemap's 28 named languages are
each fixed across all 25 quarters so that every mark keeps its identity while it moves. The
cost is survivorship: anything outside the 2026 crop never appears in earlier quarters, and a
member that was below the 101-per-economy censoring threshold in an early quarter shows a gap
or a zero-size mark there, not a true zero. Spike heights and the growth index share one fixed
scale across all quarters for the same honesty reason. Every animation is transport-controlled
(play/pause, scrub, replay, opt-in loop); nothing loops or plays uninvited, and a
reduced-motion preference renders finished states instantly.
Collaboration weight semantics are as-published. GitHub documents the
edge weight as a count of cross-economy collaboration relationships; it is not symmetric
(source → destination differs from the reverse) and its absolute unit is not defined
beyond that. Charts here compare weights to each other and never quote them as "developers".