如何用 Python 分析这次角球战术配合
你没有贴出具体代码,我先按角球战术分析这个场景,给你一套通用的 Python 分析思路和代码框架,你可以对照自己的代码看它在做什么。

角球战术分析通常要回答的问题
- 球从哪发出、落到哪(轨迹)
- 参与球员是谁、跑位路线如何
- 防守方如何站位、盯人/区域
- 关键事件节点:开球 → 第一落点 → 第二落点 → 射门/解围
典型的数据结构
角球分析一般基于两类数据:
| 数据类型 | 常见来源 | 字段示例 |
|---|---|---|
| 事件数据 | StatsBomb / Opta | timestamp, player, location, type |
| 追踪数据 | 光学追踪 / GPS | frame, player_id, x, y |
StatsBomb 的角球事件长这样(简化):
corner_event = {
"type": "Pass",
"set_piece": "Corner",
"player": "De Bruyne",
"location": [120, 0], # 角旗区
"pass_end_location": [110, 40], # 落点
"height": "High Pass",
}
可视化分析框架(核心)
import matplotlib.pyplot as plt
from mplsoccer import Pitch
pitch = Pitch(pitch_type='statsbomb', line_zorder=2)
fig, ax = pitch.draw(figsize=(10, 7))
# 1. 画角球起点
pitch.scatter(120, 0, ax=ax, s=200, color='red', label='角球点')
# 2. 画传球轨迹
pitch.arrows(120, 0, 110, 40, ax=ax, width=2,
headwidth=8, color='blue', label='传球路线')
# 3. 画落点热区(如果有多次角球)
pitch.kdeplot(x, y, ax=ax, levels=10, fill=True)
# 4. 画球员跑位(追踪数据)
for pid, traj in player_trajectories.items():
pitch.plot(traj['x'], traj['y'], ax=ax, lw=1.5)
plt.legend()
plt.show()
解读战术的关键指标
看代码时,注意它是否计算了这些:
传球距离与角度
import numpy as np dx = end_x - start_x dy = end_y - start_y distance = np.sqrt(dx**2 + dy**2) angle = np.degrees(np.arctan2(dy, dx))
- 近距离角球(前点)vs 远距离(后点)
- 内旋(in-swinger)vs 外旋(out-swinger)
落点聚类
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=3).fit(end_locations) # 通常聚成:前点、中路、后点
防守密度
# 落点周围 5 米内的防守球员数
def defenders_near(end_xy, defenders, radius=5):
return sum(np.linalg.norm(d - end_xy) < radius for d in defenders)
时间序列(追踪数据)
# 角球发出后 0-5 秒球员位移 displacement = traj.loc[t+5, ['x','y']] - traj.loc[t, ['x','y']]
读代码时的"三问法"
拿到任何一段角球分析代码,问自己:
- 输入是什么:事件数据?追踪数据?视频?
- 中间做了什么变换:坐标归一化?聚类?轨迹平滑?
- 输出在回答什么战术问题:
- 落点分布 → 战术偏好(前点/后点)
- 跑位重叠 → 挡拆/掩护配合
- 防守球员滞后 → 盯人失误
一个完整的最小示例
import pandas as pd
import numpy as np
from mplsoccer import Pitch
import matplotlib.pyplot as plt
# 假设 df 保存了本赛季所有角球
# columns: start_x, start_y, end_x, end_y, outcome, team
pitch = Pitch(pitch_type='statsbomb')
fig, ax = pitch.draw()
# 只分析某队某次角球
one_corner = df[(df.team == 'Man City') & (df.match_id == 123)]
# 轨迹
for _, row in one_corner.iterrows():
pitch.arrows(row.start_x, row.start_y,
row.end_x, row.end_y,
ax=ax, color='blue', width=2)
# 落点
pitch.scatter(one_corner.end_x, one_corner.end_y,
ax=ax, s=100, color='red', label='落点')
"角球战术轨迹与落点")
plt.show()
结论怎么下
根据代码输出,战术结论通常落在这些维度:
| 观察 | 战术含义 |
|---|---|
| 落点集中在前点 | 战术:前点抢点/后蹭 |
| 落点分散 | 战术:多样化,或随机 |
| 多名球员朝同一点跑 | 可能是"掩护跑"制造空间 |
| 防守球员分散跟踪 | 区域防守 |
| 防守球员集中贴人 | 人盯人防守 |
| 传球用内旋弧线 | 增加门将出击难度 |
如果你把具体那段 Python 代码贴出来,我可以逐行帮你解读它在分析哪一步、能不能得出"这次角球战术是前点短角球配合还是后点长传冲吊"这类结论,你也可以告诉我数据来源(StatsBomb / Opta / 自采追踪),我给更贴合的解读。