繁体   English   中英

Python的matplotlib.pyplot.quiver如何正常工作?

[英]How does Python's matplotlib.pyplot.quiver exactly work?

我试图了解NumPy模块中的箭头功能是如何工作的。 据推测,它允许以图形方式显示两个阵列的值,例如水平和垂直速度。 我有以下非常简单的例子,但我只是为了看看你是否可以帮助我找出我做得不好的事情来展示它:

x = np.linspace(0,1,11)
y = np.linspace(1,0,11)
u = v = np.zeros((11,11))
u[5,5] = 0.2

plt.quiver(x, y, u, v)

代码生成下图:

http://imgur.com/Rg3ZoHl

如您所见,箭头不是箭头,而是一条线,它长于0.2。 我的目的是获得一个长度为0.2的箭头,我想我可以用quiver做到这一点。 可能吗? 或者我应该更好地使用另一个命令?

matplotlib箭袋自动缩放。 将比例设置为1可以得到0.2个单位x和y:

x = np.linspace(0,1,11)
y = np.linspace(1,0,11)
u = v = np.zeros((11,11))
u[5,5] = 0.2

plt.quiver(x, y, u, v, scale=1)

在此输入图像描述

如果不设置scale ,matplotlib将根据平均向量长度和向量数使用自动缩放算法。 由于你只有一个长度大于零的向量,它变得非常大。 添加更多矢量使箭头连续变小。

要使箭头具有相同的x和y扩展名,需要进行一些调整:

x = np.linspace(0,1,11)
y = np.linspace(1,0,11)
u = v = np.zeros((11,11))
u[5,5] = 0.2

plt.axis('equal')
plt.quiver(x, y, u, v, scale=1, units='xy')

两个轴需要相等,单位需要设置为xy

在此输入图像描述

与你的问题无关,但有趣的是提到:有趣的是,通过写u[5, 5] = 0.2你暗示v[5, 5] = 0.2 (如你的斜箭头所示),因为在你之前写道u = v = np.zeros((11, 11)) 你可以通过写作来避免这种情况

u = np.zeros((11, 11))
v = np.zeros((11, 11))

使uv相互独立。

箭头函数可视化矢量字段,如下所示:

示例箭颤图http://matplotlib.org/_images/quiver_demo_02.png

(来自示例页面 )。 在这种类型的图中,一点处的矢量表示该点处的场矢量的大小。 例如,如果您可视化流体的速度,箭头的长度表示流体的速度。

您可以将矢量场视为将输入(位置)映射到输出(矢量,例如速度)的函数。 输出值与输入位置无关; 特别是,它们甚至可能不会以相同的单位进行测量! 因此,箭袋图只能显示不同点处场的相对大小 - 只有箭头的相对长度是有意义的,而不是它们的绝对长度。

换句话说,您不应期望0.2的字段值由数据单位中的长度为0.2的箭头表示。

但是,matplotlib提供了一个可以指定的选项: quiverscale_units选项。 根据文档,您可以给出scale_units = 'xy' ,它将使用与轴相同的单位渲染箭头长度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM