You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中制作类似示例的投手可视化图表?

Pitcher Profiler 投手可视化图表的Python实现方案

这类投手可视化的核心是基于真实棒球场地几何的投球轨迹俯视图,结合投球类型、速度等属性做分层标注。下面是适配MLB标准场地的Python实现代码与完整流程,针对几何逻辑做了明确注释:

核心实现流程

  • 定义MLB标准场地坐标系(固定投手丘、本垒板的位置参数)
  • 整理投球核心数据(释放点、进垒点、投球类型、球速)
  • 绘制场地基础元素(本垒板、投手丘、参考线)
  • 映射投球轨迹并添加属性标注
  • 优化图表比例与样式(避免几何变形)

完整代码实现

import matplotlib.pyplot as plt
import numpy as np

# 1. 定义MLB标准场地坐标系(单位:英尺)
HOME_PLATE = (0, 0)  # 本垒板中心设为原点
PITCHER_MOUND = (-60.5, 0)  # 投手丘到本垒板的标准距离为60.5英尺
# 本垒板的四个顶点坐标(用于绘制多边形)
home_plate_verts = np.array([
    [0, 1.375], [0.7125, 0], [0, -1.375], [-0.7125, 0]
])

# 2. 模拟投球数据(替换为Pitcher Profiler的真实赛后数据即可)
# 数据格式:(释放点x, 释放点y, 进垒点x, 进垒点y, 投球类型, 球速)
pitch_data = [
    (-56, 1.2, 0.1, 0.8, "四缝线速球", 95),
    (-55.8, -0.9, -0.2, -0.7, "滑球", 88),
    (-56.2, 0.3, 0.0, 0.1, "变速球", 85),
    (-55.9, 1.5, 0.3, 1.0, "四缝线速球", 96),
    (-56.1, -1.1, -0.3, -0.9, "曲球", 82)
]

# 3. 初始化画布并绘制场地基础元素
fig, ax = plt.subplots(figsize=(8, 8))
# 绘制本垒板
ax.fill(home_plate_verts[:, 0], home_plate_verts[:, 1], color='white', edgecolor='black')
# 绘制投手丘(圆形,半径18英尺)
pitcher_circle = plt.Circle(PITCHER_MOUND, 18, color='green', alpha=0.3)
ax.add_artist(pitcher_circle)
# 绘制投手释放区参考线(多数投手在距本垒55英尺左右释放球)
ax.axvline(x=-55, color='gray', linestyle='--', alpha=0.5)

# 4. 绘制投球轨迹与属性标注
# 投球类型颜色映射,方便区分
pitch_color_map = {
    "四缝线速球": "#ff4444",
    "滑球": "#4444ff",
    "变速球": "#44ff44",
    "曲球": "#ff8800"
}

for release_x, release_y, plate_x, plate_y, pitch_type, velo in pitch_data:
    # 绘制投球轨迹线
    ax.plot([release_x, plate_x], [release_y, plate_y], color=pitch_color_map[pitch_type], linewidth=2, alpha=0.7)
    # 绘制进垒点标记,用大小区分球速
    ax.scatter(plate_x, plate_y, color=pitch_color_map[pitch_type], s=velo*5, zorder=5)
    # 添加球速标注
    ax.text(plate_x + 0.2, plate_y + 0.2, f"{velo} mph", fontsize=8, weight='bold')

# 5. 调整图表样式,避免几何变形
ax.set_xlim(-70, 5)
ax.set_ylim(-5, 5)
ax.set_aspect('equal')  # 强制x/y轴等比例,这是保证几何准确性的关键
ax.set_title("Pitcher Profiler 风格投球可视化", fontsize=12, weight='bold')
ax.set_xlabel("本垒板方向(英尺)", fontsize=10)
ax.set_ylabel("左右方向(英尺)", fontsize=10)
ax.grid(True, alpha=0.3)

plt.show()

关键注意事项

  • 几何准确性:必须设置ax.set_aspect('equal'),否则投球轨迹会因坐标轴缩放比例不同而变形,这是这类可视化的核心要求。
  • 真实数据适配:从Pitcher Profiler导出数据时,提取release_pos_x、release_pos_y(释放点坐标)、plate_x、plate_y(进垒点坐标)、pitch_type(投球类型)、release_speed(球速)字段,直接替换代码中的模拟数据即可。
  • 进阶优化:如果需要交互式效果,可以改用plotly库;若要更美观的样式,可结合seaborn调整配色与线条样式。

内容的提问来源于stack exchange,提问作者Jole77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 12:43:18