首页编程开发Matplotlib【数据可视化(Matplo...

【数据可视化(Matplotlib篇)】45.绘制箭头图quiver()

本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1jG-rGG4QMuZu0t0kEEl7SA?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Data_Visualization





箭头图(Quiver Plot)是一种用于显示二维向量场的可视化方法,又称向量图。每个箭头都有方向(箭头指向)和大小(箭头长度),广泛应用于物理场分析(如电场、磁场)、流体力学模拟、数据趋势展示等场景

01

函数语法


Matplotlib quiver()函数专门用于绘制箭头,其函数语法如下:
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 轴正方向为 ,逆时针递增)、数组直接指定每个箭头的角度,弧度制

  • 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则此参数失效)。

  • cmapColormap 对象或字符串,C参数的颜色映射方案(如‘viridis’)。

  • normNormalize 对象,可选,用于将C的值标准化到[0,1]范围(控制颜色映射范围)。

  • alpha:浮点数[0,1],箭头的透明度。

  • edgecolor:颜色或‘face’,箭头边缘颜色(‘face’表示与填充色一致)。

  • linewidth/lw:浮点数,箭头边缘线宽。

  • 其他参数

  • pivot:字符串,默认‘tail’,箭头的旋转支点位置。取值包括,‘tail’以箭头尾部为支点)、‘middle’以箭头中部为支点)、‘tip’以箭头尖端为支点)。

  • units:字符串,默认‘width’width参数的参考单位(‘width’/’height’/’dots’等)。

  • axAxes 对象,可选,指定绘制箭头图的子图(默认使用当前子图)。

  • **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()

可视化结果如下图所示:


02

使用示例


  • 示例 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/


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

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments