文章目录
- 简介
- 箭头设置
- 三维场图
简介
箭头向量图十分常见,比如天气预报在显示风场的时候,就会贴心地用箭头指明风的方向。在matplotlib中,用quiver
函数来绘制箭头向量图,示例如下
import matplotlib.pyplot as plt
import numpy as np
X = np.arange(-2, 2, 0.2)
Y = np.arange(-1, 1, 0.2)
U, V = np.meshgrid(X, Y)
fig = plt.figure(figsize=(6,3))
plt.quiver(X, Y, U, V)
plt.tight_layout()
plt.show()
这个图需要4组变量,分别是X,Y,U,V,其中X,Y可以理解为坐标起点,U,V则是向量在X和Y方向的强度。
这个绘图函数虽然简洁,但其实有个问题,即X和Y都是一维数组,而在绘制quiver的时候,却自转换成了二维数组,否则图像上不可能有这么多的点,更不能和U,V一一对应,可见在quiver图中,U,V参数显然更重要一些。实际上也是如此,如果省略X,Y参数,那么得到的图像将建立自然计数坐标系,
fig = plt.figure(figsize=(6,3))
plt.quiver(U, V)
plt.tight_layout()
plt.show()
箭头设置
箭头向量图的特点几乎都在箭头这了,如果没有箭头,那quiver和散点图也就没什么区别了。quiver函数可以定制箭头的线宽、头宽、头长等信息,具体参数如下图所示
在具体设置时,length通过U,V参数指定,width为绝对的宽度,一般比较小,剩下三个参数均是width的倍数,是相对值。
另外,如果想给quiver图上色,需要设置C后者color参数。
具体示例如下
C = np.sqrt(U**2+V**2)
style = dict(width=0.005, headwidth=8, headlength=6, headaxislength=4)
fig = plt.figure(figsize=(6,3))
plt.quiver(X, Y, U, V, C, **style)
plt.tight_layout()
plt.show()
绘图结果如下
三维场图
quiver函数只需添加一个三维坐标就可以无缝体验三维场图。下面假设空间中有三颗恒星,那么用场图来表示这三颗恒星附近的引力指向。
万有引力公式 F = G m m r 2 F=\frac{Gmm}{r^2} F=r2Gmm,简单起见,让三颗恒星的质量都是1, G G G也取1,则其个方向分量可表示为
F x = x r 3 F y = y r 3 F z = z r 3 F_x=\frac{x}{r^3}\\ F_y=\frac{y}{r^3}\\ F_z=\frac{z}{r^3}\\ Fx=r3xFy=r3yFz=r3z
x, y, z = np.indices([5,5,5])/5
stars = np.random.rand(3, 3).reshape(-1,3)
u = v = w = 0 # 表示引力
for xi, yi, zi in stars:
dx, dy, dz = xi-x, yi-y, zi-z
dr = np.sqrt(dx**2+dy**2+dz**2)
u += dx/dr**3
v += dy/dr**3
w += dz/dr**3
F = u**2 + v**2 + w**2
ax = plt.subplot(projection='3d')
ax.scatter(*stars.T, c='r')
style = dict(width=0.005, headwidth=8, headlength=6, headaxislength=4)
ax.quiver(x, y, z, u, v, w, length=0.1, normalize=True)
plt.tight_layout()
plt.show()
结果如下