mplsoccer场地替换plt.plot为plt.arrow后箭头不显示的解决求助
解决plt.arrow替换plt.plot后箭头不显示的问题
我之前跟着McKay Johns的教程改传球可视化代码时也碰到过这个坑,plt.arrow和plt.plot的参数逻辑完全不一样,给你几个必查的点:
别搞混参数逻辑
plt.plot是直接传起点+终点坐标,而plt.arrow的前两个参数是起点(x,y),第三、四个参数是偏移量dx、dy(也就是终点减起点的值)。很多人直接把plot的终点坐标当dx/dy传,结果箭头要么缩成一个点,要么飞到画布外面。
错误写法:plt.arrow(start_x, start_y, end_x, end_y) # 直接传终点,错!正确写法:
dx = end_x - start_x dy = end_y - start_y plt.arrow(start_x, start_y, dx, dy)调大箭头尺寸
默认的width和head_width在足球场地的坐标系下太小,肉眼根本看不见。直接加参数调大:plt.arrow(x1, y1, dx, dy, width=0.25, head_width=1.2, head_length=1.5)width是箭身粗细,head_width/head_length是箭头大小,根据你的画布尺寸微调。
锁定坐标轴范围
如果传球坐标超出了当前plt的默认坐标轴范围,箭头会被直接裁掉。绘图后加上场地对应的坐标范围:plt.xlim(0, 120) # 足球场地宽度,按需调整 plt.ylim(0, 80) # 足球场地长度,按需调整检查绘图顺序
如果先画箭头再画场地背景或球员标记,箭头会被盖住。把箭头的绘制代码放在所有图层的最后。
给你个可直接参考的代码片段:
import matplotlib.pyplot as plt # 假设你的成功传球数据是这些列表 start_x = [10, 20, 30] start_y = [40, 50, 35] end_x = [30, 45, 55] end_y = [45, 55, 40] plt.figure(figsize=(12, 8)) # 先画场地背景(如果有) # plt.imshow(...) # 遍历绘制每个传球箭头 for x1, y1, x2, y2 in zip(start_x, start_y, end_x, end_y): dx = x2 - x1 dy = y2 - y1 plt.arrow( x1, y1, dx, dy, width=0.25, head_width=1.2, head_length=1.5, color='green', alpha=0.7 ) plt.xlim(0, 120) plt.ylim(0, 80) plt.axis('off') plt.show()
内容的提问来源于stack exchange,提问作者PaiThon
相关产品推荐
相关产品推荐

