El término «Convex Hull» en el contexto del fútbol se refiere a una técnica de análisis de datos utilizada para visualizar y entender la distribución espacial de los jugadores en el campo durante un partido. En un artículo anterior repasamos los conceptos de este tipo de gráficos; te invito a revisarlo.
En esta ocasión, vamos a crear gráficos de Convex Hull paso a paso con los datos abiertos de la Copa América 2024 que nos ofrece StatsBomb. Cabe indicar que el código puede ser utilizado para cualquier competición de dicha plataforma de datos.
1. Importamos librerías
import math
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import to_rgba
from urllib.request import urlopen
from mplsoccer import Sbopen, Pitch, FontManager, VerticalPitch, add_image
from PIL import Image
from statsbombpy import sb
2. Listamos competiciones de Statsbomb
competiciones = sb.competitions()
competiciones
3. Seleccionamos competición, en este caso Copa América 2024 y listamos los partidos
comp = sb.matches(competition_id=223, season_id=282)
comp
4. Filtramos los partidos de una selección específica
equipo = "Ecuador"
partidos = comp.loc[(comp['home_team'] == f'{equipo}')|(comp['away_team'] == f'{equipo}')]
partidos
5. Seleccionamos el partido que deseamos con el código de match_id
parser = Sbopen()
df, related, freeze, tactics = parser.event(3942228)
6. Listamos los jugadores que disputaron el partido
# Filtrar las columnas relevantes para los jugadores
players_df = df[['player_id', 'player_name']]
# Eliminar duplicados
players_df = players_df.drop_duplicates()
# Mostrar la lista de jugadores del partido
print("Lista de jugadores:")
print(players_df)
7. Ingresamos el nombre del jugador que deseamos generar el gráfico, el nombre debe ser exacto, tal como se muestra en la lista anterior
df = df[(df.player_name == 'Moisés Isaac Caicedo Corozo') & (df.type_name == 'Pass')].copy()
8. Generamos el gráfico en el campo de juego
pitch = Pitch(pitch_color='#aabb97', line_color='white',
stripe_color='#c2d59d', stripe=True) # optional stripes
fig, ax = pitch.draw(figsize=(10, 7.5))
hull = pitch.convexhull(df.x, df.y)
poly = pitch.polygon(hull, ax=ax, edgecolor='cornflowerblue', facecolor='cornflowerblue', alpha=0.3)
scatter = pitch.scatter(df.x, df.y, ax=ax, edgecolor='black', facecolor='cornflowerblue')
plt.show()
Importante: Para generar el gráfico con un jugador o competición diferente, es necesario que ejecutes nuevamente todo el código del notebook después de realizar los cambios.
El código utilizado lo puedes revisar y descargar desde mi repositorio de GitHub. Estaré muy agradecido si me ayudas a compartir este post