quiver
(*args, **kw)
绘制 2D 矢量场
调用方式如下:
quiver(U, V, **kw)
quiver(U, V, C, **kw)
quiver(X, Y, U, V, **kw)
quiver(X, Y, U, V, C, **kw)
参数说明:
X 和 Y 是箭头的 x 和 y 坐标(默认是箭头的尾部)
U 和 V 是箭头矢量的 x 和 y 分量
C 是映射箭头和颜色的颜色数组
所有参数可能是 1D或2D数组及序列。如果 X 和 Y 缺省,将视为规则网格。如果 U 和 V是 2D 数组,但 X 和 Y 是 1D 数组,并且 len(X) 和 len(Y) 与 U 的列和行相同,则使用 numpy.meshgrid 生成 2D 网格。
U,V,C 可能是 masked 数组,但是目前不支持 X 和 Y 。
关键词参数:
units: [ ‘width’ | ‘height’ | ‘dots’ | ‘inches’ | ‘x’ | ‘y’ | ‘xy’ ]
箭头单位
箭头比例的不同取决于 units。 units 为 'x' 或 'y' 时, 箭头会变大;对于其它单位,箭头大小不会发生变化。units 为 ’width‘ 或 'height' 时,当调整窗口大小时,箭头的大小会随 axes 宽和高的变化而变化,而当 units 为 'dots' 或 'inches' 时,改变窗口大小并不会改变箭头的大小。
angles: [ ‘uv’ | ‘xy’ | array ]
默认为 ’uv‘,箭头 axes 宽高比为1。如果 U == V,那么沿着水平轴逆时针旋转 45 度是箭头的方向(箭头指向右侧)。如果是 'xy',箭头的点由 (x,y) 指向 (x + u, y + v)。使用此设置可以绘制梯度场。也可以将随机角度作为数组进行传递(同样沿水平轴逆时针旋转)。注意:angles = 'xy' 时,反转数据轴的时候同样会反转arrow。
scale: [ None | float ]
每单位长度的数据单位。比如:每个绘图宽度单位为 m/s。scale 值越小,arrow 越长。当为 None 时,自适应算法会根据 平均矢量长度 和 矢量数 计算一个值。箭头的长度单位可以通过 scale_units 参数设置。
scale_units: None, 或 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”
width:
杆的宽度。默认值取决于 units 参数的设置及矢量数。典型的起始值为 绘图宽度的 0.005 倍。
headwidth: scalar
箭头宽度,为 杆宽的倍数。默认值为 3.
headlength: scalar
箭头长度, 为 杆宽的倍数。 默认值为 5。
headaxislength: scalar
在杆的交点处箭头的长。 默认值为 4.5。
minshaft: scalar
小于箭头 scale 的长度,以箭头长度为单位。不要设置此值小于1,否则那些小箭头会变得很奇怪。默认值为1。增大此值会使箭头变细。一般情况下不需要更改此值。
minlength: scalar
如果箭头的长度小于此值,将绘制以此值为半径的点。默认值为 1
pivot: [ ‘tail’ | ‘mid’ | ‘middle’ | ‘tip’ ]
旋转轴
color: [ color | color sequence ]
如果 C 给定了,则 color 参数将不会生效。
默认是稍微后突一些的箭头。
说的再多都没有图形看的直观。
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 同样可以得到上图的矢量箭头==