首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >代码实战 | 如何绘制台风方位角平均要素

代码实战 | 如何绘制台风方位角平均要素

作者头像
用户11172986
发布2026-05-07 19:13:17
发布2026-05-07 19:13:17
670
举报
文章被收录于专栏:气python风雨气python风雨

代码实战 | 如何绘制台风方位角平均要素

前言

以前很困惑文献里的台风方位角平均变量怎么算的,径向风切向风傻傻分不清,后来发现了miniufo大神开发的xvortices库,全都解决了

库包安装

项目地址

https://github.com/miniufo/xvortices

去github下载压缩包解压后如图安装即可

image
image

image

另外同作者的besttracks库也是这么安装。

完整代码

代码语言:javascript
复制
import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
from matplotlib.ticker import LogLocator, NullFormatter
from besttracks import parse_TCs
from xvortices import load_cylind, project_to_cylind

# ========================
# 1. 加载热带气旋最佳路径数据
# ========================
haima = parse_TCs('*.txt', agency='CMA',
                  tc_cond=(lambda tc: tc.ID == '200421'))[0]

# ========================
# 2. 读取格点气象数据
# ========================
dset = xr.open_dataset('/home/mw/project/Haima2004.nc')  # 请改为实际路径

# ========================
# 3. 插值到移动的柱坐标系
# ========================
olon = haima.get_as_xarray('LON')[1:]   # 时间对齐
olat = haima.get_as_xarray('LAT')[1:]

[u, v, w, h], lons, lats, etas = load_cylind(
    dset, olon, olat,
    azimNum=72, radiNum=31, radMax=6,
    lonname='lon', latname='lat'
)

# ========================
# 4. 计算风暴相对风场并投影到径向/切向
# ========================
haima.translate_velocity()
uo = haima.get_as_xarray('uo')
vo = haima.get_as_xarray('vo')

u_r = u - uo          # 相对纬向风
v_r = v - vo          # 相对经向风

uaz_r, vra_r = project_to_cylind(u_r, v_r, etas)  # 切向风、径向风

# ========================
# 5. 方位角平均
# ========================
uaz_rm = uaz_r.mean('azim')
vra_rm = vra_r.mean('azim')
wm = w.mean('azim')
hm = h.mean('azim')

# ========================
# 6. 按气压升序排序(关键修正!)
# ========================
uaz_rm = uaz_rm.sortby('lev')
vra_rm = vra_rm.sortby('lev')
wm = wm.sortby('lev')
hm = hm.sortby('lev')

# ========================
# 7. 绘制方位角平均结构(Matplotlib)
# ========================
tlev = 2   # 时间索引
fig, axes = plt.subplots(2, 2, figsize=(9.5, 7), sharex=True, sharey=True)

# ---- 图1:平均切向风 ----
ax = axes[0, 0]
cf = ax.contourf(uaz_rm.radi, uaz_rm.lev, uaz_rm.isel(time=tlev),
                 levels=np.linspace(-14, 14, 29), cmap='seismic', extend='both')
ax.set_title('mean azimuthal wind')
fig.colorbar(cf, ax=ax)

# ---- 图2:平均径向风 ----
ax = axes[0, 1]
cf = ax.contourf(vra_rm.radi, vra_rm.lev, vra_rm.isel(time=tlev),
                 levels=np.linspace(-4, 4, 17), cmap='seismic', extend='both')
ax.set_title('mean radial wind (relative)')
fig.colorbar(cf, ax=ax)

# ---- 图3:平均垂直速度 ----
ax = axes[1, 0]
cf = ax.contourf(wm.radi, wm.lev, wm.isel(time=tlev),
                 levels=np.linspace(-1, 0, 21), cmap='Reds_r', extend='both')
ax.set_title('mean vertical wind')
fig.colorbar(cf, ax=ax)

# ---- 图4:平均位势高度异常(减去外边界值) ----
ax = axes[1, 1]
anomaly = hm.isel(time=tlev) - hm.isel(time=tlev).isel(radi=-1)
cf = ax.contourf(anomaly.radi, anomaly.lev, anomaly,
                 levels=np.linspace(-50, 50, 21), cmap='seismic', extend='both')
ax.set_title('mean geopotential height anomaly')
fig.colorbar(cf, ax=ax)

# ========================
# 坐标轴设置(对数压力轴,上低下高)
# ========================
for ax in axes.flat:
    ax.set_xlabel('radius (degree)')
    ax.set_ylabel('pressure (hPa)')
    ax.set_yscale('log')
    ax.yaxis.set_major_locator(LogLocator(base=10))
    ax.yaxis.set_minor_locator(LogLocator(base=10, subs='all'))
    ax.yaxis.set_minor_formatter(NullFormatter())
    ax.invert_yaxis()                    # 让 1000 在下,100 在上
    ax.set_ylim(1000, 100) 
    ax.grid(True, linestyle='--', alpha=0.5)

plt.tight_layout()
plt.show()
image
image

image

小结

尽管安装上可能有些小阻碍,可以直接计算出方位角平均的径向风和切向风确实方便。分析台风的小伙伴可以一试

有空写写如何计算与绘制wrf的台风方位角平均,敬请期待。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气python风雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码实战 | 如何绘制台风方位角平均要素
    • 前言
    • 库包安装
    • 完整代码
    • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档