Gallery

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.

Shot map

Attacking half, vertical framing — markers sized by xG, coloured by outcome, goal angle on the best chance.

Shooting

Penalty shootout

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.

Shooting
7.32 m2.44 m123456789

Annotated build-up

One goal-scoring move told on a single pitch: comet trails for progression, labelled touches, the shot's angle.

Shooting
Goal · 0.41 xG

Pass network

Average positions with node size by touches and edge width by pass volume — the classic recipe from three primitives.

Passing
GKLBLCBRCBRBDMLCMRCMLWSTRW

Pass flow

Passes binned by start zone, one arrow per zone showing average direction, sized and coloured by volume.

Passing

Team shape

Convex hulls over both teams' outfield positions — compactness and the space between the lines at a glance.

Structure

Zonal control

A Voronoi tessellation over all 22 players, cells coloured by team — who controls which patch of grass.

Structure

Pressure heatmap

Ball-recovery pressure events binned over a fine grid on the canvas path — dense raster data without SVG's DOM cost.

Density

Zone occupation

Touches binned into the Juego de Posición zones — mplsoccer's positional heatmap, with each zone's share of touches on hover.

Density

Touch map

A full match's touches on a hexagonal lattice — even packing in every direction, and empty cells left as grass.

Density

xG race

Cumulative expected goals for both sides across the Euro 2024 final — goals marked, bookings anchored to each team's line.

Timeline
00.511.520'15'30'45'60'75'90'HTSpainEngland1.790.73Kane booked, 24'Olmo booked, 29'Stones booked, 52'Watkins booked, 90'

Match momentum

Which side was on top in the attacking third, minute by minute, across the Euro 2024 final — goals and bookings on a row beneath.

Timeline
SpainEngland0'15'30'45'60'75'90'Yellow card, 24'Yellow card, 29'Goal, 46'Yellow card, 52'Goal, 72'Goal, 85'Yellow card, 90'

Player radar

Lamine Yamal and Bukayo Saka at Euro 2024, per 90 against every outfield player with 270+ minutes — turnovers flipped so outward is always better.

Profiles
Lamine YamalBukayo Saka0.0850.170.260.340.751.52.330.060.120.180.240.581.21.82.30.561.11.72.33.32.21.10.049.21418220.931.52.22.8npxGShotsxAKey passesDribblesTurnovers ↓PressuresTackles+ Int

Player pizza

Lamine Yamal at Euro 2024 as percentiles against every outfield player with 270+ minutes — slices coloured by attacking, possession and defending.

Profiles
AttackingPossessionDefending91npxG96Shots100xA99Key passes93Dribbles93Turnovers ↓91Pressures69Tackles+ Int

Shot territory

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.

Density