from mplsoccer import Pitch, Sbopen
import matplotlib.pyplot as pltGiriş
Pas haritası, bir futbol takımının veya oyuncunun maç sırasında gerçekleştirdiği pasların sahada nereden yapıldığını ve nasıl yönlendirildiğini görsel olarak temsil eden bir analiz aracıdır. Bu harita, futbol analizinde kritik bir rol oynar çünkü bir takımın veya oyuncunun top kontrolü, pas isabetliliği, oyun kurma yeteneği ve saha içindeki genel hareketliliği hakkında derinlemesine bilgi sağlar.
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.
Pas Tipleri
- Recovery: Top kaybedildikten sonra tekrar kazanılan pasları ifade eder.
- Throw-in: Oyuncunun topu elle oyuna soktuğu durumu ifade eder.
- Interception: Rakip oyuncunun pasını keserek topu ele geçirme durumunu ifade eder.
- Corner: Köşe vuruşu ile oyuna sokulan pasları ifade eder.
- Goal Kick: Kalecinin kale vuruşu ile oyuna soktuğu pasları ifade eder.
- Free Kick: Serbest vuruşla oyuna sokulan pasları ifade eder.
- Kick Off: Maçın başında veya gol sonrası oyunun tekrar başlaması için yapılan vuruşları ifade eder.
Pas Haritasının Oluşturulması
Veri Çerçevesinin İçeriği
df veri çerçevesindeki type_name kolonundan Pass’i filtreleyeceğiz. Ardından sub_type_name kolonundan ilerleyeceğiz ve team_name Türkiye olacak.
Verilerin Çekilmesi
team = 'Turkey'
matches = {
'Georgia': 3938639,
'Portugal': 3930174,
'Czechia': 3930184,
'Austria': 3941022,
'Netherlands': 3942382
}Pasların Dağılımı ve Pas Haritası
for opponent, match_id in matches.items():
parser = Sbopen()
df, related, freeze, tactics = parser.event(match_id)
passes = df.loc[(df['type_name'] == 'Pass') & (df['team_name'] == team)].set_index('id')
plt.figure(figsize=(10, 6))
pass_type_counts = passes['sub_type_name'].value_counts().sort_values()
pass_type_counts.plot(kind='barh', color='skyblue')
plt.xlabel('Number of Passes')
plt.ylabel('Pass Type')
plt.title(f'Pass Type by {team} Against {opponent} in Euro 2024')
plt.show()
pass_types = passes['sub_type_name'].dropna().unique()
num_pass_types = len(pass_types)
cols = 3
rows = (num_pass_types // cols) + int(num_pass_types % cols > 0)
fig, axs = plt.subplots(rows, cols, figsize=(20, 7 * rows))
fig.suptitle(f"{team}'s Passes Against {opponent} in Euro 2024", fontsize=24)
axs = axs.flatten()
color_list = plt.cm.tab10.colors
colors = color_list[:num_pass_types]
color_map = {pass_type: colors[i] for i, pass_type in enumerate(pass_types)}
for i, pass_type in enumerate(pass_types):
pitch_length_x = 120
pitch_width_y = 80
pitch = Pitch(pitch_type='custom', pitch_length=pitch_length_x, pitch_width=pitch_width_y, line_color='black')
ax = axs[i]
pitch.draw(ax=ax)
subtype_passes = passes[passes['sub_type_name'] == pass_type]
for _, pass_ in subtype_passes.iterrows():
x = pass_['x']
y = pass_['y']
pass_circle = plt.Circle((x, y), 2, color=color_map[pass_type])
pass_circle.set_alpha(.2)
ax.add_patch(pass_circle)
dx = pass_['end_x'] - x
dy = pass_['end_y'] - y
pass_arrow = plt.Arrow(x, y, dx, dy, width=3, color=color_map[pass_type])
ax.add_patch(pass_arrow)
ax.set_title(pass_type, fontsize=24)
for j in range(i + 1, len(axs)):
fig.delaxes(axs[j])
plt.subplots_adjust(hspace=0, wspace=0)
plt.show()Kodun kilit yerlerine bakalım.
Her pas türü için bir futbol sahası (Pitch) çizdik ve uygun eksene (ax) yerleştirdik.
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 pasların yerleştirilmesinde kullanılan koordinat sınırlarını belirliyor.
Her pas için (x, y) koordinatlarını aldık.
plt.Arrow ile bir ok oluşturduk ve x ve y ile okun başlangıç noktasını, dx ve dy ile okun uzunluğunu ve yönünü ve width ile okun kalınlığını ayarladık.










Gelecek içeriklerde görüşmek dileğiyle.