import pandas as pd
from mplsoccer import Pitch, Sbopen
import matplotlib.pyplot as plt
Giriş
Şut haritası, bir futbol takımının veya oyuncunun maç sırasında gerçekleştirdiği şutların sahada nereden yapıldığını ve nasıl sonuçlandığını görsel olarak temsil eden bir görselleştirmedir. Şut haritası, futbol analizi için önemli bir araçtır çünkü bir takımın veya oyuncunun hücum performansını, şutların etkinliğini ve gol atma becerisini değerlendirmeye yardımcı olur.
Kullanılacak Kütüphaneler
Maçlar
StatsBomb’dan (Sbopen
) çekilecek maçların ID’leri şöyledir:
- Türkiye - Gürcistan: 3938639
- Türkiye - Portekiz: 3930174
- Çekya - Türkiye: 3930184
- Avusturya - Türkiye: 3941022
- Hollanda - Türkiye: 3942382
Maçlara ait ID’leri öğrenmek için StatsBomb Verilerine Erişim: Euro 2024 Örneği başlıklı yazıyı inceleyebilirsiniz.
Şut Tipleri
- Off T (Off Target): Hedefin dışına atılan bir şuttur.
- Blocked: Savunma oyuncuları tarafından engellenen bir şuttur.
- Post: Direğe veya üst direğe çarpan bir şuttur.
- Saved: Kaleci tarafından kurtarılan bir şuttur.
- Goal: Gol olan bir şuttur.
- Wayward: Belirgin bir şekilde hedefin dışına atılan bir şuttur.
- Saved to Post: Kaleci tarafından kurtarıldıktan sonra direğe çarpan bir şuttur.
Şut Haritasının Oluşturulması
Veri Çerçevesinin İçeriği
df
veri çerçevesindeki type_name
kolonundan Shot
’ı filtreleyeceğiz. Ardından outcome_name
kolonundan ilerleyeceğiz ve team_name
Türkiye olacak.
Verilerin Çekilmesi
= 'Turkey'
team = [3938639, 3930174, 3930184, 3941022, 3942382]
matches = []
dfs
for match in matches:
= Sbopen()
parser = parser.event(match)
df, related, freeze, tactics = df[(df['type_name'] == 'Shot') & (df['team_name'] == team)].set_index('id')
shots
dfs.append(shots)
= pd.concat(dfs, ignore_index=True)
combined_df
= list(combined_df['outcome_name'].unique()) shot_types
Şut Sonuçlarının Dağılımı
=(10, 6))
plt.figure(figsize= combined_df['outcome_name'].value_counts().sort_values()
shot_type_counts ='barh', color='skyblue')
shot_type_counts.plot(kind'Number of Shots')
plt.xlabel('Shot Outcome')
plt.ylabel(f'Shot Outcomes by {team} in Euro 2024')
plt.title( plt.show()
Şut Haritası
= {
shot_types 'Off T': 'o',
'Blocked': '<',
'Post': '^',
'Saved': 'D',
'Goal': '*',
'Wayward': 'v',
'Saved to Post': '>',
}
= 120
pitch_length_x = 80
pitch_width_y = Pitch(pitch_type='custom', pitch_length=pitch_length_x, pitch_width=pitch_width_y, line_color='black')
pitch = pitch.draw(figsize=(10, 7))
fig, ax
= plt.cm.tab10.colors[:len(shot_types)]
colors
for shot_type, marker in shot_types.items():
= combined_df[combined_df['outcome_name'] == shot_type]
subset = 'red' if shot_type == 'Goal' else colors[list(shot_types.keys()).index(shot_type)]
color for i, shot in subset.iterrows():
= shot['x']
x = shot['y']
y if shot_type == 'Goal':
=color, markersize=10, label=shot_type)
ax.plot(x, y, marker, color+ 1, y - 2, shot['player_name'].split()[-1])
plt.text(x else:
=color, markersize=7, alpha=.3)
ax.plot(x, y, marker, color
= []
legend_handles for shot_type, marker in shot_types.items():
= 'red' if shot_type == 'Goal' else colors[list(shot_types.keys()).index(shot_type)]
color 0], [0], linestyle='none', marker=marker, markersize=10, color=color, alpha=0.3, label=shot_type))
legend_handles.append(plt.Line2D([
ax.legend(=legend_handles,
handles='upper center',
loc='medium',
fontsize='',
title=len(shot_types),
ncol=(0.5, -0.03)
bbox_to_anchor
)
f"{team}'s Euro 2024 Shot Map", fontsize=20)
fig.suptitle(10, 7)
fig.set_size_inches( plt.show()
Kodun kilit yerlerine bakalım.
Pitch
sınıfını kullanarak siyah çizgili bir futbol sahası (pitch) oluşturduk ve fig, ax
değişkenleri aracılığıyla sahanın çizildiği figür ve eksenleri elde ettik. figsize
parametresiyle figürün boyutlarını belirledik (10x7 inç).
pitch_length_x
ve pitch_width_y
değişkenleri ile futbol sahasının uzunluğunu ve genişliğini ayarladık. Bu değerler saha üzerinde şutların yerleştirilmesinde kullanılan koordinat sınırlarını belirliyor.
Her şut için x
ve y
koordinatlarını aldık.
Gelecek içeriklerde görüşmek dileğiyle.