Visualization brainstorm

Where Code Comes From

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
Files developers.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.

ColumnRoleCard.NullRange / notes
iso2_codegeographic2300%ISO 3166-1 alpha-2 plus the EU aggregate; includes territories (HK, PR, RE ...)
year, quartertemporal250%2020 Q1 to 2026 Q1, complete quarterly grid; 2026 has Q1 only
developersquantitative0%101 to 32,410,529 (US, 2026 Q1); heavily right skewed
repositoriesquantitative0%tracks developers at roughly one repo per developer (see C5)
organizationsquantitative0%slowest growing of the four measures
git_pushesquantitative0%fastest moving; volume, not head count
source, destinationrelational216 × 2050%economy pairs; 4,155 directed edges in 2026 Q1 alone; no self loops
weightquantitative0%collaboration count per pair-quarter, as published; min 101 (censored)
languagenominal4040%far past any palette; color only after aggregation
language_typenominal40%programming / markup / data / prose; fits categorical color
spdx_licensenominal300%MIT holds half; NOASSERTION means "no license detected"
topicnominal1,9470%only 132 economies ever appear: the long tail is truncated upstream
num_pushersquantitative0%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.

Shape signaturewhat it rules in and out

4 × [ 1 T(25) × 1 Q × 1 G(230) ]  +  T × Q × N(404 languages)  +  T × Q × N(30 licenses)  +  T × Q × N(1,947 topics)  +  T × Q × R(216 → 205) — grain = economy-quarter

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).

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-line line-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-bar bar

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-choropleth choropleth

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-area us-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
scatterplot hr-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-chord chord chord-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-chart change-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 charts slope multi-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-bar methods-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
Exemplar
normalized-stacked-area stacked-normalized-horizontal-bar

Failure mode

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 matrices arc-diagram chord

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-race bar-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-scatterplot wealth-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-treemap treemap nested-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-diagram mobile-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-map walmarts-growth bubble-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

OptionWhy not
Force-directed network of all economies192 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 collaborationSankey 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 choroplethThe 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 languages404 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 pushesThe grain is quarterly; a calendar exposes weekday and daily structure this dataset simply does not carry.
Word cloud of topics1,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 languagesThe 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 raceMeasured, 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 chartRedundant 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".