本系列文章配套代码获取有以下两种途径:
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1jG-rGG4QMuZu0t0kEEl7SA?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Data_Visualization
箭头图(Quiver Plot)是一种用于显示二维向量场的可视化方法,又称向量图。每个箭头都有方向(箭头指向)和大小(箭头长度),广泛应用于物理场分析(如电场、磁场)、流体力学模拟、数据趋势展示等场景。
函数语法:
plt.quiver([X, Y], U, V, [C], /, **kwargs)
-
基础参数(必选):
-
X, Y:数组或标量,箭头起点的 x、y 坐标。若为数组,需与U, V形状一致;若为标量,则所有箭头起点相同。 -
U, V:数组或标量,箭头在 x、y 方向的分量(决定箭头方向和长度)。
-
向量样式参数:
-
C:数组或标量,可选参数,用于箭头颜色映射的数值。若提供,箭头颜色将根据此值通过cmap映射,覆盖color参数。
-
angles:角度计算方式,字符串或数组。取值包括,‘uv’(箭头角度由(U, V)计算,默认)、‘xy’(箭头角度基于数据坐标,x 轴正方向为 0°,逆时针递增)、数组(直接指定每个箭头的角度,弧度制)。
-
scale:浮点数,默认None,箭头长度缩放因子。值越大箭头越短,scale=1表示 1 个数据单位对应 1 个图像单位长度。
-
scale_units:字符串,默认None,与scale配合使用的单位。‘xy’(以数据坐标单位缩放)、‘inches’/’dots’(以物理单位英寸 / 像素缩放)。
-
箭头头部参数:
-
width:浮点数,箭头杆的宽度(以数据坐标为单位,默认0.005)。
-
headwidth:浮点数,箭头头部的宽度(相对于杆宽的倍数,默认3)。
-
headlength:浮点数,箭头头部的长度(相对于杆宽的倍数,默认5)。
-
headaxislength:浮点数,箭头头部中轴长度(相对于杆宽的倍数,默认4.5)。
-
minshaft:浮点数,箭头杆的最小长度(相对于头部长度的倍数,默认1)。
-
minlength:浮点数,箭头的最小总长度(以头部长度为单位,默认1)。
-
minlength:浮点数,箭头的最小总长度(以头部长度为单位,默认1)。

-
颜色与外观参数:
-
color:颜色或颜色序列,箭头的统一颜色(若指定C则此参数失效)。
-
cmap:Colormap 对象或字符串,C参数的颜色映射方案(如‘viridis’)。
-
norm:Normalize 对象,可选,用于将C的值标准化到[0,1]范围(控制颜色映射范围)。
-
alpha:浮点数[0,1],箭头的透明度。
-
edgecolor:颜色或‘face’,箭头边缘颜色(‘face’表示与填充色一致)。
-
linewidth/lw:浮点数,箭头边缘线宽。
-
其他参数:
-
pivot:字符串,默认‘tail’,箭头的旋转支点位置。取值包括,‘tail’(以箭头尾部为支点)、‘middle’(以箭头中部为支点)、‘tip’(以箭头尖端为支点)。
-
units:字符串,默认‘width’,width参数的参考单位(‘width’/’height’/’dots’等)。
-
ax:Axes 对象,可选,指定绘制箭头图的子图(默认使用当前子图)。
-
**kwargs:其他通用参数(如label用于图例标注)。
通过调整这些参数,可以灵活控制箭头图的视觉效果。
# 创建网格
x = np.arange(0, 2.2, 0.2)
y = np.arange(0, 2.2, 0.2)
X, Y = np.meshgrid(x, y)
# 定义向量场:计算每个箭头在x和y方向的分量(决定箭头方向和长度
U = np.cos(X) # x方向分量
V = np.sin(Y) # y方向分量
plt.figure(figsize=(8, 6))
# 绘制箭头图
plt.quiver(X, Y, U, V,
scale=20, # 箭头长度缩放因子,值越大箭头越短
color='red', # 箭头填充颜色为红色
width=0.005, # 箭头杆的宽度(以数据坐标为单位)
headwidth=3, # 箭头头部宽度(为杆宽的3倍)
headlength=5, # 箭头头部长度(为杆宽的5倍)
edgecolor='black', # 箭头边缘颜色为黑色
minshaft=3, # 箭头杆的最小长度(为头部长度的3倍)
linewidth=0.8 # 箭头边缘线宽
)
plt.title('基本箭头图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.grid()
plt.show()
可视化结果如下图所示:

使用示例:
-
示例 1:带颜色映射的箭头图
当向量存在大小差异时(如流速场、电场强度分布),可通过C参数实现 “颜色映射”,让箭头颜色随向量大小变化,增强数据的层次感。
# 创建网格
x = np.arange(0, 2.2, 0.2)
y = np.arange(0, 2.2, 0.2)
X, Y = np.meshgrid(x, y)
# 定义向量场
U = np.cos(X) # x方向分量
V = np.sin(Y) # y方向分量
# 计算向量大小(用于颜色映射)
M = np.sqrt(U**2 + V**2)
plt.figure(figsize=(9, 6))
# 绘制彩色箭头
plt.quiver(X, Y, U, V,
M, # 颜色映射依据
cmap='viridis', # 指定颜色映射方案
scale=20
)
plt.colorbar(label='向量大小')
plt.title("带颜色映射的箭头图")
plt.show()

-
示例 2:根据返回值修改样式
quiver()函数会返回一个Quiver对象(所有箭头元素集合),可用于后续修改(例如,通过set_color()调整颜色)。
# 创建示例数据
x = np.linspace(0, 2*np.pi, 8)
y = np.linspace(0, 2*np.pi, 8)
X, Y = np.meshgrid(x, y)
U = np.cos(X)
V = np.sin(Y)
# 绘制初始箭头图并获取返回值
quiver_obj = plt.quiver(X, Y, U, V, scale=25)
# 通过返回值修改样式
quiver_obj.set_linestyle('--') # 设置线型
quiver_obj.set_edgecolor('black') # 边缘颜色
quiver_obj.set_facecolor('lightblue') # 填充颜色
quiver_obj.set_alpha(0.7) # 设置透明度
quiver_obj.set_linewidth(1.5) # 设置线宽
quiver_obj.set_edgecolor('black') # 设置边缘颜色
plt.title('通过返回值修改样式')
plt.show()

-
示例 3:与其他图表结合,增加视觉效果
将箭头图与其他图表结合使用,可以增强数据可视化的层次感和信息量。
例如,通过叠加散点图、热力图和等高线来增强数据可视化效果:
# 用于从自定义的颜色分段中创建线性渐变配色映射(Colormap)
from matplotlib.colors import LinearSegmentedColormap
# 1. 创建数据网格
x = np.linspace(-3, 3, 21) # x轴从-3到3,共21个点
y = np.linspace(-3, 3, 21) # y轴从-3到3,共21个点
X, Y = np.meshgrid(x, y) # 生成网格坐标
# 2. 计算向量场(箭头图数据)
U = -Y # x方向分量(逆时针旋转场)
V = X # y方向分量(逆时针旋转场)
magnitude = np.sqrt(U**2 + V**2) # 向量大小(用于颜色映射)
# 3. 计算背景数据(热力图和等高线)
Z = np.exp(-(X**2 + Y**2)/3) * np.cos(2 * np.sqrt(X**2 + Y**2))
# 4. 创建自定义颜色映射
colors = [(0.9, 0.9, 1), (0, 0, 0.8)] # 从浅蓝到深蓝
cmap_background = LinearSegmentedColormap.from_list("custom_blue", colors)
# 5. 创建图形
fig, ax = plt.subplots(figsize=(10, 8))
# 6. 绘制背景热力图(第一层)
heatmap = ax.imshow(
Z,
extent=[-3, 3, -3, 3], # 匹配网格范围
origin='lower', # 使坐标原点在左下角
cmap=cmap_background,
alpha=0.6 # 半透明,避免掩盖其他元素
)
# 7. 绘制等高线(第二层)
contour = ax.contour(
X, Y, Z,
levels=10, # 等高线数量
colors='gray', # 灰色线条
linewidths=0.8, # 线宽
alpha=0.7 # 半透明
)
ax.clabel(contour, inline=True, fontsize=8) # 添加等高线标签
# 8. 绘制箭头图(第三层)
quiver = ax.quiver(
X, Y, U, V,
magnitude, # 用向量大小作为颜色映射依据
cmap='plasma', # 箭头颜色映射
scale=40, # 箭头长度缩放
width=0.003, # 箭头宽度
headwidth=4, # 箭头头部宽度
alpha=0.8 # 箭头透明度
)
# 9. 绘制散点图(第四层,突出显示关键点)
# 找出Z值最大和最小的点
max_idx = np.unravel_index(np.argmax(Z), Z.shape)
min_idx = np.unravel_index(np.argmin(Z), Z.shape)
highlight_x = [X[max_idx], X[min_idx]]
highlight_y = [Y[max_idx], Y[min_idx]]
scatter = ax.scatter(
highlight_x, highlight_y,
c=['red', 'green'], # 红色标记最大值,绿色标记最小值
s=100, # 点大小
edgecolors='white', # 白色边缘
linewidths=2, # 边缘线宽
zorder=5 # 置于顶层
)
# 10. 添加颜色条和标注
cbar1 = fig.colorbar(heatmap, ax=ax, shrink=0.7, pad=0.02, label='背景场强度')
cbar2 = fig.colorbar(quiver, ax=ax, shrink=0.7, pad=0.1, label='向量场大小')
ax.set_title('箭头图与多图表结合的可视化示例', fontsize=14)
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.grid(True, linestyle='--', alpha=0.3) # 网格线
ax.set_aspect('equal') # 等比例显示
plt.tight_layout()
plt.show()

更多内容可以前往官网查看:
https://matplotlib.org/stable/


本篇文章来源于微信公众号: 码农设计师