You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Matplotlib绘制风矢垂直廓线:风矢未按高度绘制问题

我太懂这个坑了!Matplotlib的quiver默认确实是按数组索引来定位的,直接用的话风矢完全和实际高度对不上,折腾起来挺闹心的。下面给你一套完整的解决方案,既能实现共享Y轴的双廓线图,又能让风矢精准对应到你的实际高度z值上:

完整代码示例

首先咱们先构造点示例数据(你直接替换成自己的z、u、v数组就行):

import numpy as np
import matplotlib.pyplot as plt

# 模拟数据:高度z(0-10km,间隔1km),U(东向风)、V(北向风)分量
z = np.arange(0, 10000, 1000)
u = np.random.randn(len(z)) * 5 + 10  # 带点噪声的东向风
v = np.random.randn(len(z)) * 5 - 5   # 带点噪声的北向风

接下来创建共享Y轴的子图,并绘制风分量廓线:

# 创建1行2列的子图,共享Y轴(核心!这样调整一个子图的Y轴范围,另一个自动同步)
fig, (ax_u, ax_v) = plt.subplots(1, 2, figsize=(10, 8), sharey=True)

# 绘制U、V分量的垂直廓线
ax_u.plot(u, z, 'b-', linewidth=2, label='U 分量 (m/s)')
ax_v.plot(v, z, 'r-', linewidth=2, label='V 分量 (m/s)')

# 基础样式设置
ax_u.set_xlabel('U 风速 (m/s)')
ax_u.set_ylabel('高度 (m)')
ax_u.set_title('水平风U分量垂直廓线')
ax_u.legend()

ax_v.set_xlabel('V 风速 (m/s)')
ax_v.set_title('水平风V分量垂直廓线')
ax_v.legend()

关键:让风矢对应实际高度

重点来了!咱们直接把实际高度数组z传给quiver的y参数,而不是用数组索引。这里我选择把风矢画在U分量廓线图的右侧,避免和曲线重叠:

# 确定风矢的x位置:取U分量x轴的最大值加2,留出空隙
x_quiver = ax_u.get_xlim()[1] + 2

# 绘制风矢:x位置、y位置(实际高度z)、U分量、V分量
# scale参数控制风矢长度,数值越大风矢越短,根据你的风速范围调整
q = ax_u.quiver(x_quiver, z, u, v, scale=50, color='k')

# 可选:添加风矢刻度图例,方便看风速大小
ax_u.quiverkey(q, X=0.9, Y=1.05, U=10, label='10 m/s', labelpos='E', coordinates='axes')

最后调整Y轴范围(因为共享Y轴,只需要设置一个子图就行),并展示:

# 设置Y轴显示范围(比如只看0-8000m的高度)
ax_u.set_ylim(0, 8000)

plt.tight_layout()
plt.show()

额外技巧:单独的风矢子图

如果你想把风矢单独放在一个子图里,也可以这样改:

# 创建1行3列的子图,共享Y轴
fig, (ax_u, ax_v, ax_quiver) = plt.subplots(1, 3, figsize=(12, 8), sharey=True)

# 绘制廓线(和之前一样)
ax_u.plot(u, z, 'b-', linewidth=2, label='U 分量')
ax_v.plot(v, z, 'r-', linewidth=2, label='V 分量')

# 风矢子图:x用0占位,只显示风矢
ax_quiver.quiver(np.zeros_like(z), z, u, v, scale=50, color='k')
ax_quiver.set_xlim(-1, 1)  # 限制x轴范围让风矢居中
ax_quiver.set_xticks([])   # 隐藏x轴刻度,更简洁
ax_quiver.set_title('风矢')

# 其他样式设置和之前一致
ax_u.set_xlabel('U (m/s)')
ax_u.set_ylabel('高度 (m)')
ax_u.set_title('水平风U分量垂直廓线')
ax_u.legend()

ax_v.set_xlabel('V (m/s)')
ax_v.set_title('水平风V分量垂直廓线')
ax_v.legend()

ax_u.set_ylim(0, 8000)

plt.tight_layout()
plt.show()

核心要点总结

  1. 共享Y轴:用sharey=True创建子图,这样你只需要调整任意一个子图的ylim,两个子图的Y轴范围会自动同步,完美解决你说的“通过z值控制Y轴范围”的需求。
  2. 风矢定位:绝对不要用数组索引(比如np.arange(len(z)))作为quiver的y坐标,直接传入你的实际高度数组z,风矢就会精准对应到每个高度上。
  3. 风矢大小调整:通过scale参数控制风矢长度,风速大就调大scale,避免风矢太长重叠;风速小就调小scale,让风矢更明显。

内容的提问来源于stack exchange,提问作者pck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:24:26