Matplotlib quiver绘图箭头方向异常及箭头大小调整问题
问题根源
matplotlib.axes.Axes.quiver的入参不是起点、终点坐标,其核心参数定义为:
X, Y:箭头起点的x、y坐标U, V:箭头在x方向、y方向的位移分量,而非终点绝对坐标
原代码直接将终点坐标传入U、V位置,会导致矢量分量计算完全错误。例如定义的线段[(1, 0), (1, -1)],原代码传参等价于起点(1,0)、x方向位移1、y方向位移-1,实际渲染终点为(2,-1),和预期的(1,-1)不符,方向自然错误。
解决方案
坐标修正
传入参数前先通过终点坐标减起点坐标,计算真实的位移分量U、V:U = 终点x坐标 - 起点x坐标V = 终点y坐标 - 起点y坐标
同时需要指定angles='xy'、scale_units='xy'、scale=1,保证箭头方向、长度和坐标轴坐标尺度完全对齐。
箭头尺寸调整
通过以下常用参数控制箭头大小样式:
scale:数值越大箭头整体长度越短,设置为1时1单位矢量长度对应坐标轴1单位实际长度width:箭杆的宽度,数值越大箭杆越粗headwidth:箭头头部宽度与箭杆宽度的比值,默认值为3headlength:箭头头部长度与箭杆宽度的比值,默认值为5
修正后代码
import matplotlib.pyplot as plt # 定义箭头的起点、终点坐标对 I4 = [[(0, 0), (1, 0)], [(0, 0), (0, -1)], [(1, 0), (1, -1)], [(0, -1), (1, -1)]] fig, ax = plt.subplots(figsize=(5, 5)) for start, end in I4: x0, y0 = start x1, y1 = end u = x1 - x0 v = y1 - y0 ax.quiver( x0, y0, u, v, angles='xy', scale_units='xy', scale=1, width=0.015 # 可调整该值修改箭杆粗细 ) # 调整坐标轴范围,避免箭头被截断 ax.set_xlim(-0.2, 1.2) ax.set_ylim(-1.2, 0.2) plt.show()
运行后四个箭头会完全按照定义的路径渲染,组成开口向上的正方形三边,方向和位置完全符合预期。需要调整箭头大小时,直接修改上述提到的尺寸参数即可。
内容的提问来源于stack exchange,提问作者Wiz123
相关产品推荐
相关产品推荐

