Matplotlib - 矢量场图 (Quiver Plot)
矢量场图(quiver plot)是一种用于可视化矢量场的图形类型,它同时表示方向和大小。简单来说,它在网格上显示箭头,每个箭头代表一个具有特定方向和长度的矢量。
- 想象你正在研究一个地区的风向模式。你想可视化该区域各点的风向和风力。
- 你可以使用矢量场图进行这种可视化,其中图中的每个箭头表示风吹向的方向,而箭头的长度表示风速。
通过查看矢量场图,你可以快速看出风如何在整个区域流动,并识别出风力较强或较弱的区域 −
Matplotlib 中的矢量场图
在 Matplotlib 中,矢量场图是一种使用箭头表示矢量场的可视化。我们可以使用 'pyplot' 模块中的 quiver() function 来创建箭头,从而在 Matplotlib 中显示矢量场图。
该函数接受矢量场的 X 和 Y 坐标(对于三维对象还有 Z),并将其方向和大小表示为箭头。
让我们开始绘制一个基本的矢量场图。
示例 - 基本矢量场图
Matplotlib 中的基本矢量场图在二维空间中可视化一个矢量。它由一个箭头组成,箭头的长度和方向表示矢量的大小和方向。
在下面的示例中,我们创建一个基本的矢量场图来将一个矢量表示为箭头。我们首先通过 'x_pos' 和 'y_pos' 指定箭头的起始位置,它们分别表示 X 和 Y 坐标。
箭头的方向由 'x_direct' 和 'y_direct' 确定,分别对应 x 轴和 y 轴。最终图显示一个从 (1, 1) 开始并指向某个方向的箭头 −
import numpy as np
import matplotlib.pyplot as plt
# 定义箭头
x_pos = 1
y_pos = 1
x_direct = 2
y_direct = 1
# 创建图形
fig, ax = plt.subplots(figsize=(12, 7))
# 绘制矢量场图
ax.quiver(x_pos, y_pos, x_direct, y_direct, angles='xy', scale_units='xy', scale=1, color='green', width=0.02, label='Arrow')
# 设置坐标轴范围
ax.set_xlim([0, 4])
ax.set_ylim([0, 3])
ax.set_title('Basic Quiver Plot')
# 显示图形
plt.show()
输出
以上代码的输出如下 −
示例 - Meshgrid 矢量场图
在 Matplotlib 中,meshgrid 矢量场图以独立的箭头形式直观地表示均匀分布的矢量。整个矢量场的大小和方向可以通过对各个箭头的大小和方向求和来计算。
在这里,我们通过在 2D 网格上排列箭头,创建一个包含多个矢量场的 meshgrid 矢量场图。X 和 Y 坐标的范围为 0 到 4,步长为 0.3。每个矢量场的方向通过分别使用正弦和余弦角度参数化 X 和 Y 坐标来计算。这产生了一个图,其中多个矢量场以不同的箭头表示 −
import numpy as np
import matplotlib.pyplot as plt
# 创建箭头
x = np.arange(0, 4, 0.3)
y = np.arange(0, 4, 0.3)
X, Y = np.meshgrid(x, y)
u = np.sin(X)*Y
v = np.cos(Y)*Y
# 创建图形
fig, ax = plt.subplots(figsize =(14, 8))
# 绘制矢量场图
ax.quiver(X, Y, u, v)
# 设置坐标轴范围
ax.axis([-0.3, 2.3, -0.3, 2.3])
ax.set_aspect('equal')
ax.set_title('Meshgrid Quiver Plot')
# 显示图形
plt.show()
输出
以上代码的输出如下 −

示例 - 梯度 Quiver 图
Matplotlib 中的梯度 quiver 图表示二维空间中具有变化梯度的矢量场的可视化。梯度表示矢量场的强度,由箭头数量表示。特定区域箭头越多,该区域的矢量场越强。
以下示例创建一个梯度 quiver 图,以显示矢量场强度的变化。X 和 Y 坐标范围从 -2 到 2,步长为 0.1。梯度计算为 X 和 Y 值方向的变化,由 'dx' 和 'dy' 表示 −
import numpy as np
import matplotlib.pyplot as plt
# 创建箭头
x = np.arange(-2, 2, 0.1)
y = np.arange(-2, 2, 0.1)
# 创建梯度函数
X, Y = np.meshgrid(x, y)
z = np.sin(X) * np.cos(Y)
dx, dy = np.gradient(z)
# 创建图形
fig, ax = plt.subplots(figsize=(9, 9))
# 绘制 quiver
ax.quiver(X, Y, dx, dy)
# 设置坐标轴限制
ax.set_aspect('equal')
ax.set_title('Gradient Quiver Plot')
# 显示图形
plt.show()
输出
执行上述代码后,我们将得到以下输出 −
示例 - 彩色 Quiver 图
在 Matplotlib 中,彩色 quiver 图是基本 quiver 图的进阶版本,其中矢量场由不同颜色的箭头表示。箭头的颜色取决于特定参数,如距原点的距离、强度或方向。
现在,我们创建一个彩色 quiver 图来表示矢量场。我们将箭头的起始位置设置在 0 到 2 的范围内,并基于 X 和 Y 值参数化方向。
然后,我们根据每支箭头距场中心的距离为其分配颜色。靠近中心的箭头颜色较深,而较远的箭头颜色较浅 −
import numpy as np
import matplotlib.pyplot as plt
# 创建箭头
x = np.arange(0, 2 * np.pi + 2 * np.pi / 20, 2 * np.pi / 20)
y = np.arange(0, 2 * np.pi + 2 * np.pi / 20, 2 * np.pi / 20)
X, Y = np.meshgrid(x, y)
u = np.cos(X) * np.sin(Y)
v = np.sin(X) * np.cos(Y)
# 定义颜色
color = np.sqrt(u**2 + v**2)
# 创建图形
fig, ax = plt.subplots(figsize=(14, 9))
# 绘制 quiver
ax.quiver(X, Y, u, v, color, alpha=1, cmap='viridis')
# 设置坐标轴限制
ax.axis([0, 2 * np.pi, 0, 2 * np.pi])
ax.set_aspect('equal')
ax.set_title('Colored Quiver Plot')
# 显示图形
plt.show()
输出
得到的输出如下所示 −
