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

标签 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

最佳答案

您的问题有两个组成部分,两者都与您选择如何表示数据有关。

quiver 的默认行为是自动将向量缩放到合理的大小以获得漂亮的结果。 The documentation说了那么多:

The default settings auto-scales the length of the arrows to a reasonable size. To change this behavior see the scale and scale_units kwargs.

然后

scale_units : [ ‘width’ | ‘height’ | ‘dots’ | ‘inches’ | ‘x’ | ‘y’ | ‘xy’ ], None, optional

[...]

If scale_units is ‘x’ then the vector will be 0.5 x-axis units. To plot vectors in the x-y plane, with u and v having the same units as x and y, use angles='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

相信我:那里有一个小箭头。要点是,这样要么所有向量都将是点(如果缩小太多),要么它们都不是。然后你就有了一个理智的情况,并且可以相应地选择向量的整体缩放。

关于python - plt.quiver() 在某些地方绘制点而不是向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46943073/

相关文章:

python - 在此示例中,名称 *open* 属于内置作用域还是全局作用域?

python - 在 matplotlib 动画中绘制不同颜色的点

python - 在python中浏览ftp目录

python - 随机森林分类器 - 将索引标签标记转换回字符串值

python - 仅连接字符串列表的一部分取决于其在 python 中的值

python - Pandas.plot 多图同图

python - 有什么办法可以让 basemap 不显示情节吗?

python - matplotlib 时间序列图表上的颜色填充

python - 图像的牛眼图

python - Django 管理页面不显示数据库表(djangobook 第 06 章)