plt.quiver()在某些地方绘制点而不是矢量

时间:2017-10-25 22:36:41

标签: python matplotlib

我目前正在通过创建矢量图来分析一些数据。所有载体的长度均为1个单位。大多数都很好,但某些载体如:

fig = plt.figure()
plt.axes(xlim=(-24, 24), ylim=(0, 150))
plt.quiver([-19.1038], [96.5851], [-19.1001+19.1038], [97.5832-96.5851],angles='xy', scale_units='xy', scale=1, headwidth=1, headlength=10, minshaft=5)
plt.show()

显示为一个点。 (请注意,我不是像这样单独绘制我的向量;我只是画了这个特定的向量来尝试调试我的代码。)这似乎只发生在几乎垂直的向量上。我还注意到,如果我放大"这个问题就解决了。在矢量上(即改变轴缩放)。但是,我不能这样做,因为我的情节中的许多其他矢量将超出域/范围。有没有其他方法来解决这个问题?

问题如下图所示:

demonstration of the problem: only vertical arrows are rendered as dots

1 个答案:

答案 0 :(得分:0)

您的问题有两个组成部分,两者都与您选择代表数据的方式有关。

quiver的默认行为是将矢量自动缩放到合理的大小以获得漂亮的结果。 The documentation尽可能多地说:

  

默认设置会自动将箭头的长度缩放到合理的大小。要更改此行为,请参阅scalescale_units kwargs。

然后

  

scale_units:['width'| '身高'| '点'| 'inches'| 'x'| 'y'| 'xy'],无,可选

     

[...]

     

如果scale_units为'x',则向量将为0.5 x轴单位。要在xy平面中绘制矢量,u和v具有与x和y相同的单位,请使用角度=' xy',scale_units =' xy',scale = 1。

因此,在您的情况下,您要告诉quiverxy数据单元中绘制箭头。由于箭头是单位长度,因此它被绘制为1个长度的箭头。另一方面,您的数据限制很大:40个单位宽,150个单位高。在这个尺度上,长度为1的箭头太小了,matplotlib决定截断箭头并绘制一个点。

如果放大,就像你自己说的那样,会出现箭头。如果我们删除将箭头变成牙签的参数,那么如果你看得足够近(而不是轴),你绘制的箭头就完全没了问题:

result: single arrow zoomed in

现在,问题是为什么这种行为取决于你的向量的方向。这种行为的原因是图中的x和y限制是不同的,因此单位长度水平线和单位长度垂直线包含不同数量的像素(因为您的数据在 xy <中缩放/ em>单位)。这意味着虽然水平箭头的长度足以准确表示,但垂直箭头变得如此之短,以至于matplotlib决定将它们截断为点,使用默认的箭头格式,它不应该明显,但是你的自定义箭头非常糟糕。你的用例是这样的,matplotlib使用的渲染截断恰好落在水平向量的长度和垂直向量的长度之间。

您有两个简单的选择。一种是将箭头的比例增加到准确表示每个方向的点。这可能是这里一个小XY问题中Y的解决方案。你应该真正做什么,准确地代表你的数据。由于您在 xy 数据单元中绘制了矢量字段,因此您可能希望xy轴具有相同的大小,并且您希望箭头具有视觉单位长度(即与其方向无关的长度)。

所以我建议你强制你的情节在两个轴上都有相同的单位,代价是以矩形图结束:

fig = plt.figure()
ax = fig.add_subplot(111)
ax.axis('scaled') # <-- key addition
ax.axis([-24, 24, 0, 150])
ax.quiver([-19.1038], [96.5851], [-19.1001+19.1038], [97.5832-96.5851],
          angles='xy', scale_units='xy', scale=1, headwidth=1,
          headlength=10, minshaft=5)
plt.show()

result with equal axes scaling

相信我:那里有一个小箭头。重点是这样,你的所有矢量都将是点(如果你缩小太多),或者两者都不会。然后你有一个理智的情况,并可以相应地选择你的向量的整体缩放。