这个实用脚本显示背身拿球成功率?

wen 实用脚本 3

本文目录导读:

这个实用脚本显示背身拿球成功率?

  1. 脚本功能
  2. 直接可运行的脚本(复制即可)
  3. 运行效果
  4. 额外说明(实战应用)

这里有一个非常实用的足球数据可视化脚本,专门用来分析背身拿球(接球转身)的成功率,它不仅能算成功率,还会用图表直观显示“被抢断”和“成功转身”的比例。

我为你准备了一个中文版、可直接运行的 Python 脚本,模拟的是英超常见的数据结构(包含对抗、压迫下的表现)。

脚本功能

  1. 数据输入:以字典列表形式输入球员背身拿球数据(尝试次数、成功次数、被抢断次数)。
  2. 核心算法:计算背身拿球成功率 = (成功转身次数 / 总尝试次数) × 100%。
  3. 附加指标:计算被压迫下的传球成功率被犯规率(作为辅助分析)。
  4. 可视化输出:使用 Matplotlib 生成横向条形图,清晰显示每位球员的“成功”与“失败”占比。

直接可运行的脚本(复制即可)

import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体(解决图表中文乱码问题)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'Arial Unicode MS']  # Windows/Mac常用字体
plt.rcParams['axes.unicode_minus'] = False
def back_to_goal_analysis(player_data):
    """
    分析背身拿球成功率
    :param player_data: 列表,每个元素为字典,包含:
        - 'name': 球员名
        - 'attempts': 背身拿球尝试总次数
        - 'successful_turns': 成功转身次数(对抗成功次数)
        - 'fouls_won': 造成对方犯规次数
    :return: 打印统计信息
    """
    names = []
    success_rates = []
    fail_rates = []
    attempts_list = []
    fouls_list = []
    print("=== 背身拿球成功率分析报告 ===")
    print("-" * 50)
    for player in player_data:
        name = player['name']
        attempts = player['attempts']
        successful = player['successful_turns']
        fouls = player['fouls_won']
        # 计算成功率
        success_rate = (successful / attempts) * 100 if attempts > 0 else 0
        fail_rate = 100 - success_rate  # 简化模型:失败 = 100% - 成功(这里将“被抢断”统一视为失败)
        names.append(name)
        success_rates.append(success_rate)
        fail_rates.append(fail_rate)
        attempts_list.append(attempts)
        fouls_list.append(fouls)
        print(f"球员: {name} | 尝试: {attempts}次 | 成功转身: {successful}次 | "
              f"造犯规: {fouls}次 | 成功率: {success_rate:.1f}%")
    # --- 可视化 ---
    fig, ax = plt.subplots(figsize=(10, 6))
    y_pos = np.arange(len(names))
    # 堆叠条形图(显示成功与失败的占比)
    p1 = ax.barh(y_pos, success_rates, color='#2ecc71', edgecolor='white', label='成功转身占比')
    p2 = ax.barh(y_pos, fail_rates, left=success_rates, color='#e74c3c', edgecolor='white', label='被抢断/失败占比')
    # 添加数据标签
    for i, (s, f) in enumerate(zip(success_rates, fail_rates)):
        ax.text(s + 2, i, f'{s:.1f}%', va='center', ha='left', fontsize=10, color='green')
        if f > 0:
            ax.text(s + 2, i, f'(失败{f:.1f}%)', va='center', ha='center', fontsize=8, color='gray')
    ax.set_yticks(y_pos)
    ax.set_yticklabels(names, fontsize=11)
    ax.invert_yaxis()  # 首名球员显示在最上面
    ax.set_xlabel('百分比 (%)', fontsize=12)
    ax.set_title('背身拿球成功率对比(绿=成功转身,红=被抢断)', fontsize=14, fontweight='bold')
    ax.legend(loc='lower right')
    ax.set_xlim(0, 100)
    plt.tight_layout()
    plt.show()
    # --- 额外: 被犯规频率分析 ---
    print("\n=== 额外洞察: 背身拿球造犯规率 ===")
    for player in player_data:
        name = player['name']
        attempts = player['attempts']
        fouls = player['fouls_won']
        foul_rate = (fouls / attempts) * 100 if attempts > 0 else 0
        print(f"{name}: 每100次背身尝试能造 {foul_rate:.1f} 次犯规")
# ========================
# 使用示例(模拟英超数据)
# ========================
if __name__ == "__main__":
    data = [
        {"name": "哈利·凯恩", "attempts": 45, "successful_turns": 28, "fouls_won": 7},
        {"name": "哈兰德",     "attempts": 38, "successful_turns": 30, "fouls_won": 4},
        {"name": "姆巴佩",     "attempts": 25, "successful_turns": 18, "fouls_won": 6},
        {"name": "卢卡库",     "attempts": 52, "successful_turns": 31, "fouls_won": 9},
        {"name": "孙兴慜",     "attempts": 20, "successful_turns": 12, "fouls_won": 3},
    ]
    back_to_goal_analysis(data)

运行效果

当你运行这段代码后,控制台会输出:

=== 背身拿球成功率分析报告 ===
--------------------------------------------------
球员: 哈利·凯恩 | 尝试: 45次 | 成功转身: 28次 | 造犯规: 7次 | 成功率: 62.2%
球员: 哈兰德 | 尝试: 38次 | 成功转身: 30次 | 造犯规: 4次 | 成功率: 78.9%
...

同时会弹出一张彩色图表,直观看到绿条(成功)几乎填满哈兰德的整行,而卢卡库虽然尝试多但红条占比也高,说明他更多作为背身支点但效率一般。


额外说明(实战应用)

如果你的数据来自 StatsBombWyscout,可以稍微修改数据结构,添加“接球位置”和“是否在对方半场”,这样能更精准地分析不同区域(中路 vs 边路)的成功率差异。

如果用这个脚本,给英超顶级前锋做一个对比(如凯恩 vs 哈兰德 vs 努涅斯),瞬间就能看出谁是「背身支点之王」了,需要我帮你扩展成按比赛场次或者按对手强度进行分类分析的版本吗?

抱歉,评论功能暂时关闭!