Build a Player Radar (Pizza) Chart in Python with mplsoccer
A radar (pizza) chart turns a player's percentile profile into one glance. Build one in Python with mplsoccer's PyPizza, from a handful of per-90 metrics.
Category · 8 articles
Pull the data and draw the charts yourself.
Reading analysis is one thing; producing it is another. These tutorials take you from a blank file to a real pass map, shot map or xG table, using free public data and free open-source tools — mostly Python with statsbombpy and mplsoccer, with a spreadsheet option for those who'd rather not write code.
Every code block is real and runnable. Copy it, change the team, and you're doing your own analysis by the end of the afternoon.
A radar (pizza) chart turns a player's percentile profile into one glance. Build one in Python with mplsoccer's PyPizza, from a handful of per-90 metrics.
A league table rewards results; an xG table rewards process. Turn each match's xG into expected points in Python to see who's over- or under-achieving.
Goals in football are close to random — but not quite. Build a simple Poisson model in Python to turn team attack and defence strengths into scoreline probabilities.
A league table hides whether a team is improving or living on borrowed time. Build a rolling expected-goals form chart in Python to see the real trend.
A hands-on, copy-pasteable tutorial — load a real match with statsbombpy and draw a pass map and an xG-sized shot map with mplsoccer, using the 2022 World Cup final.
A beginner-friendly tutorial: install statsbombpy, understand the competitions-matches-events data model, and build a top-xG leaderboard in a few lines of real Python.
A practical, ranked guide to the free public soccer data sources worth your time - StatsBomb open data, Understat, FBref and more - with what each covers, how to access it, and the catch.
A no-code tutorial: build an expected-goal-difference (xGD) and expected-points league table in a spreadsheet from public Understat data, and use it to spot who is over- or under-performing.