使用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()
核心要点总结
- 共享Y轴:用
sharey=True创建子图,这样你只需要调整任意一个子图的ylim,两个子图的Y轴范围会自动同步,完美解决你说的“通过z值控制Y轴范围”的需求。 - 风矢定位:绝对不要用数组索引(比如
np.arange(len(z)))作为quiver的y坐标,直接传入你的实际高度数组z,风矢就会精准对应到每个高度上。 - 风矢大小调整:通过
scale参数控制风矢长度,风速大就调大scale,避免风矢太长重叠;风速小就调小scale,让风矢更明显。
内容的提问来源于stack exchange,提问作者pck
相关产品推荐
相关产品推荐

