绘制 2D 矢量场
quiver(U, V, **kw) quiver(U, V, C, **kw) quiver(X, Y, U, V, **kw) quiver(X, Y, U, V, C, **kw)
(1)‘width’ or ‘height’: axes 的宽或高
(2)‘dots’ or ‘inches’: pixels 或 inches, 依赖于 figure dpi
(3)‘x’, ‘y’, or ‘xy’: X, Y, 或 sqrt(X^2+Y^2) 数据单位
注意:箭头比例的不同取决于 units。units 为 'x' 或 'y' 时, 箭头会变大;对于其它单位,箭头大小不会发生变化。units 为 ’width‘ 或 'height' 时,当调整窗口大小时,箭头的大小会随 axes 宽和高的变化而变化,而当 units 为 'dots' 或 'inches' 时,改变窗口大小并不会改变箭头的大小。
默认为 ’uv‘,箭头 axes 宽高比为1。如果 U == V,那么沿着水平轴逆时针旋转 45 度是箭头的方向(箭头指向右侧)。如果是 'xy',箭头的点由 (x,y) 指向 (x + u, y + v)。使用此设置可以绘制梯度场。也可以将随机角度作为数组进行传递(同样沿水平轴逆时针旋转)。
注意:angles = 'xy' 时,反转数据轴的时候同样会反转arrow。
比如:每个绘图宽度单位为 m/s。scale 值越小,arrow 越长。当为 None 时,自适应算法会根据 平均矢量长度 和 矢量数 计算一个值。箭头的长度单位可以通过 scale_units 参数设置。
例如:如果 scale_units = 'inches',scale = 2,(u, v) = (1, 0),那么矢量将是 0.5 inches。如果 scale_inches = 'width',那么矢量将是 axes 宽的一半。
如果 scale_inches = ’x‘,那么矢量长度将是 x-axis 单位的一半。要在 xy 平面绘制矢量图,u 和 v 单位要和 x 和 y 一致。使用如下设置 “angles=’xy’, scale_units=’xy’, scale=1”。
默认值取决于 units 参数的设置及矢量数。典型的起始值为 绘图宽度的 0.005 倍。
默认值为 3.
默认值为 5。
默认值为 4.5。
不要设置此值小于1,否则那些小箭头会变得很奇怪。默认值为1。增大此值会使箭头变细。一般情况下不需要更改此值。
默认值为 1
旋转轴
如果 C 给定了,则 color 参数将不会生效。
注意:quiver默认是稍微后突一些的箭头。 如果要使箭头是三角形,设置参数 headlength == headaxislength; 如果要让箭头更尖,减小 headwidth 或是 增加 headlength 和 headaxislength 参数; 为了让箭头相对于杆更小,可减小所有的 head 类参数。
说的再多都没有图形看的直观。
import matplotlib.pyplot as plt
import numpy as np
X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)
plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X, Y, U, V, units='xy')
plt.show()
可以看出上图矢量箭头比较密集,下面可以仅选取数组的一部分来绘制
import matplotlib.pyplot as plt
import numpy as np
X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)
plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy')
plt.show()
可以看出箭头的密度变小了,如果放大看的话,箭头并不是三角形的,下面设置为三角形看看
import matplotlib.pyplot as plt
import numpy as np
X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)
plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy', headlength = 5, headaxislength = 5)
plt.show()
由放大后的图可以看出箭头已经变为三角形了
再试试其它参数看看
import matplotlib.pyplot as plt
import numpy as np
X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)
plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy', headlength = 5, headaxislength = 5, headwidth = 5)
plt.show()
和之前相比, headwidth 参数设置为 5,默认值为3,也就是说箭头宽度为杆宽的5倍。与上图相比,箭头变大了。
import matplotlib.pyplot as plt
import numpy as np
X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)
plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy', headlength = 5, headaxislength = 5, headwidth = 5, width = 0.01)
plt.show()
这是杆宽变小后的图。之前的杆宽设置的都是程序自行设定的,基本上都符合要求,所以一般情况下,width 参数是不需要设置的。
如果想让箭头变尖一些呢
import matplotlib.pyplot as plt
import numpy as np
X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)
plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy', headlength = 5, headaxislength = 3, headwidth = 5)
plt.show()
减小 headaxislength
也可以这样做来达到上面的效果
import matplotlib.pyplot as plt
import numpy as np
X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)
plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy', headlength = 7, headaxislength = 5, headwidth = 5)
plt.show()
仔细对比上面两张图,可以发现,增大 headlength 虽然也能让箭头变成明显的后突类型,但是箭头的长度增加了。
如果减小 headlength 呢
import matplotlib.pyplot as plt
import numpy as np
X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2))
U = np.cos(X)
V = np.sin(Y)
plt.figure()
plt.title('Arrows scale with plot xy')
Q = plt.quiver(X[::5,::5], Y[::5,::5], U[::5,::5], V[::5,::5], units='xy', headlength = 3, headaxislength = 5, headwidth = 5)
plt.show()
谁会需要这种形状的矢量箭头呢==
增大 headaxislength 同样可以得到上图的矢量箭头==