如何在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
相关产品推荐
相关产品推荐

