Shot map
Attacking half, vertical framing — markers sized by xG, coloured by outcome, goal angle on the best chance.
Finished visualisations, each built from a handful of composable pieces. Every card ships its full source — copy it, or open it as a standalone project.
Attacking half, vertical framing — markers sized by xG, coloured by outcome, goal angle on the best chance.
Every kick of England v Switzerland at Euro 2024 where it crossed the line, numbered in kick order, with the penalty spot below for distance.
One goal-scoring move told on a single pitch: comet trails for progression, labelled touches, the shot's angle.
Average positions with node size by touches and edge width by pass volume — the classic recipe from three primitives.
Passes binned by start zone, one arrow per zone showing average direction, sized and coloured by volume.
Convex hulls over both teams' outfield positions — compactness and the space between the lines at a glance.
A Voronoi tessellation over all 22 players, cells coloured by team — who controls which patch of grass.
Ball-recovery pressure events binned over a fine grid on the canvas path — dense raster data without SVG's DOM cost.
Touches binned into the Juego de Posición zones — mplsoccer's positional heatmap, with each zone's share of touches on hover.
A full match's touches on a hexagonal lattice — even packing in every direction, and empty cells left as grass.
Cumulative expected goals for both sides across the Euro 2024 final — goals marked, bookings anchored to each team's line.
Which side was on top in the attacking third, minute by minute, across the Euro 2024 final — goals and bookings on a row beneath.
Lamine Yamal and Bukayo Saka at Euro 2024, per 90 against every outfield player with 270+ minutes — turnovers flipped so outward is always better.
Lamine Yamal at Euro 2024 as percentiles against every outfield player with 270+ minutes — slices coloured by attacking, possession and defending.
A forward's season of shots as a smooth kernel density surface, cropped to the attacking half — the shape of a shooting profile, not a bin count.