足球比赛两队拦截、抢断数据可视化案例
下面给你一个完整的 Python 案例,用模拟数据 + 可视化展示如何查看和对比两队的拦截、抢断数据,你可以把模拟数据替换成真实数据源(如 StatsBomb、FBref 抓取的数据)。

用 pandas + matplotlib 对比两队数据
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 模拟两队数据(可替换为真实比赛数据)
data = {
'球队': ['A队', 'A队', 'A队', 'B队', 'B队', 'B队'],
'球员': ['张三', '李四', '王五', '赵六', '孙七', '周八'],
'拦截': [3, 2, 4, 1, 3, 2],
'抢断': [2, 4, 1, 3, 1, 2],
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 2. 按球队汇总
team_stats = df.groupby('球队')[['拦截', '抢断']].sum()
team_stats['拦截+抢断'] = team_stats['拦截'] + team_stats['抢断']
print("\n按球队汇总:")
print(team_stats)
# 3. 分组柱状图对比
fig, ax = plt.subplots(figsize=(8, 5))
x = np.arange(len(team_stats.index))
width = 0.35
bars1 = ax.bar(x - width/2, team_stats['拦截'], width, label='拦截', color='#4C72B0')
bars2 = ax.bar(x + width/2, team_stats['抢断'], width, label='抢断', color='#DD8452')
# 数值标签
for bars in [bars1, bars2]:
for bar in bars:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2, height + 0.1,
f'{int(height)}', ha='center', va='bottom', fontsize=11)
ax.set_xticks(x)
ax.set_xticklabels(team_stats.index)
ax.set_ylabel('次数')
ax.set_title('两队拦截 & 抢断数据对比')
ax.legend()
ax.set_ylim(0, max(team_stats['拦截'].max(), team_stats['抢断'].max()) + 2)
plt.tight_layout()
plt.show()
输出效果:一张分组柱状图,左边蓝色柱子是拦截,右边橙色是抢断,每根柱子上有数字标签,一眼就能看出哪队防守更凶。
用 seaborn 画热力图(球员维度)
import seaborn as sns
# 球员-指标透视表
pivot = df.pivot_table(index='球员', columns='球队',
values=['拦截', '抢断'], aggfunc='sum')
# 画热力图
plt.figure(figsize=(7, 5))
sns.heatmap(pivot, annot=True, fmt='.0f', cmap='YlOrRd',
cbar_kws={'label': '次数'})'球员拦截/抢断热力图')
plt.tight_layout()
plt.show()
可以看到每个球员在两项防守指标上的强弱(颜色越深数值越高)。
接入真实数据的思路
如果你要接真实数据,常见的几种来源:
| 数据源 | 方式 |
|---|---|
| FBref | pandas.read_html() 直接抓网页表格 |
| StatsBomb Open Data | statsbombpy 库,有 events 数据可统计 Interception / Duel |
| Understat | understat 库 |
| 体育 API | API-Football、Football-data.org 等 |
以 FBref 为例的抓取代码片段
import pandas as pd url = "https://fbref.com/en/comps/9/Premier-League-Stats" # 先找到“Defensive Actions”表格的 table id tables = pd.read_html(url) # 选择包含 Interceptions、Tackles 的表格后: # df = tables[i] # df[['Squad', 'Interceptions', 'Tackles']]
注意:FBref 有反爬限制,建议加
time.sleep()或直接下载 CSV。
从 StatsBomb events 统计示例
from statsbombpy import sb
events = sb.events(match_id=3788741) # 示例 match_id
# 拦截事件
interceptions = events[events['type'] == 'Interception']
inter_by_team = interceptions.groupby('team').size()
# 抢断:StatsBomb 里对应 Duel 中的 "Tackle"
duels = events[events['type'] == 'Duel']
tackles = duels[duels['duel'].apply(lambda x: x.get('type') == 'Tackle' if isinstance(x, dict) else False)]
tackles_by_team = tackles.groupby('team').size()
print("拦截:\n", inter_by_team)
print("抢断:\n", tackles_by_team)
小结
查看两队拦截/抢断数据的一般流程:
- 获取数据 → CSV / 网页 / API / Events
- 清洗聚合 →
groupby('球队')[[...]].sum() - 可视化对比 → 柱状图、热力图、雷达图
- 解读 → 拦截多说明预判好,抢断多说明对抗积极
如果你告诉我你手头的数据格式(CSV 列名 / API 结构),我可以帮你写针对性的统计 + 可视化代码。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播