如何用 Python 分析这次角球战术配合
你想用 Python 分析角球战术配合,思路其实可以拆成数据层 → 可视化层 → 战术解读层三步走,下面给你一套完整可复用的框架。

先明确要分析的要素
一次角球战术配合,核心关注点通常是:
| 维度 | 具体问题 |
|---|---|
| 发球方式 | 内旋/外旋?短角球/长传? |
| 跑位路线 | 谁做假动作?谁真正接应? |
| 防守反应 | 盯人/区域?是否被牵扯出空当? |
| 关键节点 | 第一落点、第二落点、射门点 |
| 结果 | 射门/进球/被解围 |
数据准备(三种常见来源)
import pandas as pd
# 方案A:StatsBomb 开放数据(有详细的角球事件)
from statsbombpy import sb
events = sb.events(match_id=3788741) # 示例比赛
corners = events[events['type'] == 'Pass'] # 筛选角球传球
# 方案B:自己标注的坐标数据
# 格式:x, y (0-120 或 0-100),时间戳,球员,事件类型
df = pd.read_csv('corner_sequence.csv')
# 方案C:跟踪数据(每帧22人坐标)
tracking = pd.read_csv('tracking_frame.csv')
推荐字段结构:
timestamp, player, team, x, y, event_type, target_x, target_y
可视化:画出战术板
import matplotlib.pyplot as plt
from mplsoccer import Pitch
pitch = Pitch(pitch_type='statsbomb', line_color='black')
fig, ax = pitch.draw(figsize=(10, 7))
# 只画角球发生后的5秒序列
seq = df[(df['t'] >= corner_time) & (df['t'] <= corner_time + 5)]
# 传球路线(带箭头表示方向)
for _, row in seq[seq['event_type'] == 'pass'].iterrows():
pitch.arrows(row.x, row.y, row.target_x, row.target_y,
ax=ax, width=2, headwidth=8, color='blue')
# 球员跑位轨迹
for player in seq['player'].unique():
p = seq[seq['player'] == player]
pitch.plot(p.x, p.y, ax=ax, marker='o', linewidth=2, label=player)
# 关键节点高亮
pitch.scatter(corner_x, corner_y, ax=ax, s=300, color='red', alpha=0.5)
ax.legend(loc='upper left')'角球战术配合轨迹')
plt.show()
进阶分析:跑位与空间
# 1. 计算球员跑动距离与方向
def run_distance(traj):
return np.sum(np.sqrt(np.diff(traj.x)**2 + np.diff(traj.y)**2))
# 2. 用 Voronoi 看谁在牵扯防守、制造空当
from mplsoccer import Voronoi
team1 = seq[seq.team=='attack'][['x','y']].values
team2 = seq[seq.team=='defense'][['x','y']].values
vor = Voronoi(team1, team2, ax=ax)
# 3. 检测「跑位吸引」:某防守球员偏离初始位置的距离
def displacement(defender_id):
d = seq[seq.player == defender_id]
return np.linalg.norm(d.iloc[-1][['x','y']] - d.iloc[0][['x','y']])
战术解读的模板
拿到图和数据后,按这个逻辑讲故事:
发球点与旋向:左边角球内旋 → 落点在小禁区线附近
2. 第一层跑动:2名球员向近门柱冲刺 → 吸引3名防守球员
3. 第二层跑动:后插上的中卫从点球点斜插远门柱(关键)
4. 空间生成:Voronoi 显示远门柱出现 2㎡ 空当
5. 结果:头球攻门 / 被解围
用代码可以量化第4、5步:
# 计算射门瞬间最近防守球员距离
shot = seq[seq.event_type=='shot'].iloc[0]
dists = np.linalg.norm(seq[seq.team=='defense'][['x','y']] - shot[['x','y']], axis=1)
print(f"最近防守球员距离:{dists.min():.2f} 米")
如果你手头有具体案例
告诉我:
- 数据来源(视频?统计表?StatsBomb?)
- 想回答的问题(为什么成功/失败?谁跑位关键?)
- 现有字段(有坐标吗?有时间戳吗?)
我可以帮你写出针对这次角球的具体分析脚本,包括动图(matplotlib.animation 或 plotly)回放。
最简上手路径:先用 mplsoccer 把事件坐标画出来,再手动对照视频标注关键帧,最后用文字 + 箭头图输出战术报告,要不要我给你写一个可直接跑的动图回放模板?