📌 文章标签:Python | 气象可视化 | Skyborn | 流线图 | 大气科学 ⏱️ 阅读时间:约 8 分钟 💻 代码可运行:是
之前发了弯曲箭头的教程,skyborn库作者评论区说他也集成了modplot的代码。既然skyborn没空搞,那我们来试一下吧
作为一个在气象可视化摸爬滚打多年的"老司机",我必须推荐一个宝藏工具——Skyborn!虽然它不是专门的箭头库,但它的弯曲流线功能简直是大气可视化的"天花板"!✨(此处广告位招租)
⚠️ 重要提醒:Skyborn 是一个气候与大气科学综合工具包,它的弯曲流线功能只是众多功能之一。但是话说回来,在大气风场可视化方面,它绝对是"天花板级别"的存在!🌟 (我是不是该向那小子收广告费了)
!pip install skyborn -i https://pypi.mirrors.ustc.edu.cn/simple/
听到"弯曲箭头",你可能会想到这样:
↗️ 或者 ↘️ 但 Skyborn 的弯曲流线图是这样的:
〰️ 〰️ 〰️ ↘️ ↙️ 〰️ 〰️ 它绘制的是矢量场的流线(streamlines),流线上带有指示风向的箭头。相比普通箭头,流线能更好地展示风场的连续性和演变趋势。
📚 名词解释:流线是某一时刻速度场中的一条曲线,曲线上每点的切线方向与该点的速度方向一致。简单说,就是"风的轨迹线"。
⚠️ 重要:Skyborn 的 curved_quiver() 函数必须传入 xarray Dataset,不能直接传 numpy 数组!
import skyborn as skb
import matplotlib.pyplot as plt
import xarray as xr
import numpy as np
ds =xr.open_dataset('/home/mw/input/era58091/ERA5-2023-08_pl.nc')
u = ds['u'].sel(level=700, time='2023-08-02T00:00:00.000000000')
v = ds['v'].sel(level=700, time='2023-08-02T00:00:00.000000000')
u_reversed = u.sel(latitude=slice(None, None, -1))
v_reversed = v.sel(latitude=slice(None, None, -1))
lon = u_reversed['longitude']
lat = u_reversed['latitude']
Lon, Lat = np.meshgrid(lon, lat)
# 直接绑定数据,画图!⭐ 注意:使用 ds 数据时,ds 参数传入数据集
fig, ax = plt.subplots(figsize=(14, 8))
quiver_set = skb.plot.curved_quiver(
ds=ds.sel(level=200, time='2023-08-02T00:00:00.000000000'), # ✅ 传入 xarray 数据集
x='longitude',
y='latitude',
u='u',
v='v',density=5,
arrowsize=1,
ax=ax,linewidth=0.4, color='k'
)
plt.colorbar(quiver_set.lines, ax=ax, label='风速 (m/s)', shrink=0.8)
plt.title('📈 ERA5 风场再分析数据', fontsize=14)
plt.show()

image
一读者留言 :“风场还是ncl画的好看,这个剪头有点太黑了,如果能换成v形箭头就好了”
就这位读者的留言新增这一小节,你什么时候有不能画v形的错觉了
参数 | 作用 | 调节技巧 |
|---|---|---|
ds | xarray 数据集 | ✅ 必须传入 Dataset,不能是 None |
x | x 坐标变量名 | 如 'lon'、'longitude' |
y | y 坐标变量名 | 如 'lat'、'latitude' |
u | u 分量变量名 | 风的东西方向分量 |
v | v 分量变量名 | 风的南北方向分量 |
density | 流线疏密 | 越大越密,数据量大时用 0.5-0.8 |
linewidth | 线宽 | 1.0-2.0 比较合适 |
arrowsize | 箭头大小 | 1.0-2.0,根据整体比例调整 |
color | 线条颜色 | 'steelblue'、'navy' 都很专业 |
arrowstyle | 箭头样式 | 推荐 '- |
cmap | 颜色映射 | coolwarm, RdYlBu_r, viridis |
integration_direction | 积分方向 | 'forward', 'backward', 'both' |
# 不同箭头样式对比
styles = ['->', '-|>', '<-', '<->', 'fancy', 'simple']
fig, axes = plt.subplots(2, 3, figsize=(16, 10))
axes = axes.flatten()
for i, style in enumerate(styles):
ax = axes[i]
skb.plot.curved_quiver(
ds=ds.sel(level=200, time='2023-08-02T00:00:00.000000000'),
ax=ax,
x='longitude',
y='latitude',
u='u',
v='v',
arrowstyle=style,
arrowsize=1.5,
color='steelblue',
density=5
)
ax.set_title(f'箭头样式: {style}', fontsize=14, fontweight='bold')
ax.set_xlabel('')
ax.set_ylabel('')
plt.tight_layout()
plt.suptitle('🎨 不同箭头样式对比', fontsize=18, fontweight='bold', y=1.02)
plt.show()
print("\n🎨 推荐使用 '-|>' 方头箭头,最有专业数值预报的感觉!")

image

image
总得来说,skyborn集成的还行,当然主要是我画的行。
这个函数比较拘泥于xarray格式,对新手不太友好,对格式不那么标准的文件也不友好
也许等哪天得闲去github提一个PR