from mplsoccer import Pitch, Sbopen
import matplotlib.pyplot as plt
Giriş
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
= 'Turkey'
team = {
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():
= Sbopen()
parser = parser.event(match_id)
df, related, freeze, tactics = df.loc[(df['type_name'] == 'Pass') & (df['team_name'] == team)].set_index('id')
passes
=(10, 6))
plt.figure(figsize= passes['sub_type_name'].value_counts().sort_values()
pass_type_counts ='barh', color='skyblue')
pass_type_counts.plot(kind'Number of Passes')
plt.xlabel('Pass Type')
plt.ylabel(f'Pass Type by {team} Against {opponent} in Euro 2024')
plt.title(
plt.show()
= passes['sub_type_name'].dropna().unique()
pass_types
= len(pass_types)
num_pass_types = 3
cols = (num_pass_types // cols) + int(num_pass_types % cols > 0)
rows
= plt.subplots(rows, cols, figsize=(20, 7 * rows))
fig, axs f"{team}'s Passes Against {opponent} in Euro 2024", fontsize=24)
fig.suptitle(= axs.flatten()
axs
= plt.cm.tab10.colors
color_list = color_list[:num_pass_types]
colors
= {pass_type: colors[i] for i, pass_type in enumerate(pass_types)}
color_map
for i, pass_type in enumerate(pass_types):
= 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 = axs[i]
ax =ax)
pitch.draw(ax
= passes[passes['sub_type_name'] == pass_type]
subtype_passes
for _, pass_ in subtype_passes.iterrows():
= pass_['x']
x = pass_['y']
y = plt.Circle((x, y), 2, color=color_map[pass_type])
pass_circle .2)
pass_circle.set_alpha(
ax.add_patch(pass_circle)= pass_['end_x'] - x
dx = pass_['end_y'] - y
dy = plt.Arrow(x, y, dx, dy, width=3, color=color_map[pass_type])
pass_arrow
ax.add_patch(pass_arrow)
=24)
ax.set_title(pass_type, fontsize
for j in range(i + 1, len(axs)):
fig.delaxes(axs[j])
=0, wspace=0)
plt.subplots_adjust(hspace
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.