← Back to portfolio

Visualizations

Visual gallery

Everything here is built in Python with mplsoccer and matplotlib, from event data. Each project shows the output first and links to the notebook that produced it, so you can read the code as easily as the picture.

Pitch maps for shots, assists and positioning.

Shot map

Every shot a player takes in a season, placed on the pitch, sized by xG and coloured by outcome.

Open the notebook
Randal Kolo Muani, shots, 24/25
Randal Kolo Muani, shots, 24/25

Assist map

Where a player's assists are delivered from and where they arrive.

Open the notebook
Pedri, assists, 24/25
Pedri, assists, 24/25

Heat maps

Positional density split by offensive and defensive actions. The base spatial function reused across several of the projects below.

Open the notebook
Offensive heat map
Offensive heat map
Defensive heat map
Defensive heat map

Sonars, expected passes, passmaps and pass clustering.

Pass sonar

Average length and frequency of a player's passes by direction, in one shape.

Open the notebook
Angelo Stiller, pass sonar, 24/25
Angelo Stiller, pass sonar, 24/25

Expected passes (xP)

Completion measured against the difficulty of the passes attempted: who beats their expected numbers, by how much, and against whom.

Open the notebook
Completion against expected completion, league-wide
Completion against expected completion, league-wide
Passing profile for one player
Passing profile for one player
Two players compared on the same axes
Two players compared on the same axes

Passmaps

The same player seen three ways: build-up passes, progressive passes, and passes played straight after a defensive action.

Open the notebook
Dean Huijsen, build-up passes
Dean Huijsen, build-up passes
Dean Huijsen, progressive passes
Dean Huijsen, progressive passes
Dean Huijsen, passes after a defensive action
Dean Huijsen, passes after a defensive action

Passing clusters

Every pass from a position clustered into repeatable types, so players can be ranked on the clusters that actually carry value.

Open the notebook
The four most played clusters for a position
The four most played clusters for a position
Rayan Cherki's four most played clusters
Rayan Cherki's four most played clusters
Top ten players in the most valuable clusters
Top ten players in the most valuable clusters

Ball carrying, mapped and measured.

Carry maps

Where a player carries the ball, overall and when the carry moves play forward.

Open the notebook
Tino Anjorin, progressive carries
Tino Anjorin, progressive carries
Tino Anjorin, all carries
Tino Anjorin, all carries

Carry output

What those carries produce once the player gives the ball up.

Open the notebook
Tino Anjorin, what his carries produce
Tino Anjorin, what his carries produce

Trends, consistency, box entries, receiving and take-ons.

xG difference trend

Rolling xG for and against across a season, so form is separated from results.

Open the notebook
Liverpool, rolling xG difference
Liverpool, rolling xG difference

Metric consistency

Rolling values of a chosen metric, to show whether a team's level holds or swings.

Open the notebook
Juventus, rolling metric values
Juventus, rolling metric values

Two-season differential

One team's metrics compared across two seasons, gains and losses side by side.

Open the notebook
One team across two seasons
One team across two seasons

Box entries

How a team gets the ball into the penalty area, by route and by volume.

Open the notebook
Marseille, box entries, 24/25
Marseille, box entries, 24/25

Receiving ability

What players do in the seconds after they receive the ball, as a leaderboard and as a map.

Open the notebook
Top players after receiving
Top players after receiving
Dani Ceballos, after-reception map
Dani Ceballos, after-reception map

Take-ons from a standstill

Dribbles started with no run-up, the harder version of the skill, plus who does it best.

Open the notebook
Lamine Yamal, take-ons from a standstill
Lamine Yamal, take-ons from a standstill
Top players for standstill take-ons
Top players for standstill take-ons