Note
Go to the end to download the full example code
Heatmap Juego de Posición
This example shows how to plot all pressure events from three matches as a Juego de Posición heatmap.
import matplotlib.patheffects as path_effects
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.colors import LinearSegmentedColormap
from mplsoccer import VerticalPitch, FontManager, Sbopen
# get data
parser = Sbopen()
match_files = [19789, 19794, 19805]
df = pd.concat([parser.event(file)[0] for file in match_files]) # 0 index is the event file
# filter chelsea pressure events
mask_chelsea_pressure = (df.team_name == 'Chelsea FCW') & (df.type_name == 'Pressure')
df = df.loc[mask_chelsea_pressure, ['x', 'y']]
Custom colormap, font, and path effects
# see the custom colormaps example for more ideas on setting colormaps
pearl_earring_cmap = LinearSegmentedColormap.from_list("Pearl Earring - 10 colors",
['#15242e', '#4393c4'], N=10)
# fontmanager for google font (robotto)
robotto_regular = FontManager()
path_eff = [path_effects.Stroke(linewidth=3, foreground='black'),
path_effects.Normal()]
Plot positional heatmap
# setup pitch
pitch = VerticalPitch(pitch_type='statsbomb', line_zorder=2,
pitch_color='#22312b', line_color='white')
# draw
fig, ax = pitch.draw(figsize=(4.125, 6))
bin_statistic = pitch.bin_statistic_positional(df.x, df.y, statistic='count',
positional='full', normalize=True)
pitch.heatmap_positional(bin_statistic, ax=ax, cmap='coolwarm', edgecolors='#22312b')
pitch.scatter(df.x, df.y, c='white', s=2, ax=ax)
labels = pitch.label_heatmap(bin_statistic, color='#f4edf0', fontsize=18,
ax=ax, ha='center', va='center',
str_format='{:.0%}', path_effects=path_eff)

Plot the chart again with a title
We will use mplsoccer’s grid function to plot a pitch with a title and endnote axes.
pitch = VerticalPitch(pitch_type='statsbomb', line_zorder=2, pitch_color='#1e4259')
fig, axs = pitch.grid(endnote_height=0.03, endnote_space=0,
title_height=0.08, title_space=0,
# Turn off the endnote/title axis. I usually do this after
# I am happy with the chart layout and text placement
axis=False,
grid_height=0.84)
fig.set_facecolor('#1e4259')
# heatmap and labels
bin_statistic = pitch.bin_statistic_positional(df.x, df.y, statistic='count',
positional='full', normalize=True)
pitch.heatmap_positional(bin_statistic, ax=axs['pitch'],
cmap=pearl_earring_cmap, edgecolors='#22312b')
labels = pitch.label_heatmap(bin_statistic, color='#f4edf0', fontsize=18,
ax=axs['pitch'], ha='center', va='center',
str_format='{:.0%}', path_effects=path_eff)
# endnote and title
axs['endnote'].text(1, 0.5, '@your_twitter_handle', va='center', ha='right', fontsize=15,
fontproperties=robotto_regular.prop, color='#dee6ea')
axs['title'].text(0.5, 0.5, "Pressure applied by\n Chelsea FC Women", color='#dee6ea',
va='center', ha='center', path_effects=path_eff,
fontproperties=robotto_regular.prop, fontsize=25)
# sphinx_gallery_thumbnail_path = 'gallery/pitch_plots/images/sphx_glr_plot_heatmap_positional_002.png'
plt.show() # If you are using a Jupyter notebook you do not need this line

Total running time of the script: ( 0 minutes 1.601 seconds)