颤栗()在某些地方用点代替矢量

2024-06-16 12:04:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在通过创建矢量图来分析一些数据。所有向量的长度都是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


Tags: 数据fig绘制单位plt向量figureangles
1条回答
网友
1楼 · 发布于 2024-06-16 12:04:39

您的问题有两个部分,它们都与您选择如何表示数据有关。在

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单位缩放的)。这意味着,虽然水平箭头足够长,可以精确地表示,但是垂直箭头变得非常短,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

相信我:里面有一支小箭。主要的一点是,这样一来,你的所有向量要么都是点(如果你放大得太大),要么它们都不是。然后你就有了一个正常的情况,可以相应地选择向量的整体比例。在

相关问题 更多 >