爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 601|回复: 1

[源代码] 绘制水汽通量等值线、水汽通量散度填色和风场箭矢图

[复制链接]

新浪微博达人勋

发表于 2024-6-5 09:42:21 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
import xarray as xr
import numpy as np
import cartopy
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import matplotlib
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER

# 设置全局字体为新罗马
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.serif'] = ['Times New Roman']
# 设置全局字体权重为normal
plt.rcParams['font.weight'] = 'normal'
# 设置全局字体大小
matplotlib.rcParams['font.size'] = 19  # 设置全局字体大小为12

# 载入数据
data_path = r'D:/pythonProjec/19.nc'  # 替换为您的文件路径
ds = xr.open_dataset(data_path)
# 选择特定时间和高度数据
time = '2024-05-19T10:00:00'
level_hPa = 700
ds_selected = ds.sel(time=time,level=level_hPa)

# 获取数据变量
u = ds_selected['u']  # 东西向风速
v = ds_selected['v']  # 南北向风速
q = ds_selected['q']  # 比湿

# 获取经度和纬度,假设这些是坐标维度
longitude = u.longitude
latitude = u.latitude

# 计算水汽通量
qu = q * u  # 东西向水汽通量
qv = q * v  # 南北向水汽通量
wvf = np.sqrt(qu**2 + qv**2)

# 计算水汽通量散度
div_q = (qu.differentiate('longitude') + qv.differentiate('latitude')) * 10

#选择绘图区域
extents = [107, 111, 31, 35]
crs = ccrs.PlateCarree()
# 创建图形和轴对象
fig = plt.figure(figsize=[8,10])
ax = fig.add_subplot(111, projection=crs)
ax.set_extent(extents, crs)
gl = ax.gridlines(draw_labels=True,
                   xlocs=np.arange(extents[0], extents[1], 0.5),  # 经度位置,包含边界值
                   ylocs=np.arange(extents[2], extents[3], 0.5),
                   xformatter=LONGITUDE_FORMATTER,
                   yformatter=LATITUDE_FORMATTER,
                   linestyle='--',
                   linewidth=0)
# 绘制水汽通量散度的阴影图。
mfc_contourf = ax.contourf(longitude,latitude,div_q,cmap='RdBu_r',extend='both')
# 添加颜色条
cb = fig.colorbar(mfc_contourf, ax=ax, label='Water Vapor Flux Divergence ', location='right',pad=0.1,
                     shrink=0.5, aspect=15)

# 绘制水汽通量等高线图
contour2 = ax.contour(longitude, latitude, wvf,  colors='green', linewidths=1, linestyles='-',alpha=1)
c2=plt.clabel(contour2, inline=True, fontsize=10)

#绘制风场箭矢图
# 使用quiver函数需要确保数据的间隔,这里我们每隔2个点取样
Q = ax.quiver(longitude[::2], latitude[::2], u[::2, ::2], v[::2, ::2], scale=300, color="k")
# 说明箭轴长度与风速的对应关系
ax.quiverkey(Q,                      #传入quiver句柄
             X= 0.1, Y = -0.07,       #确定 label 所在位置,都限制在[0,1]之间
             U = 12,                 #参考箭头长度 表示12
             angle = 0,              #参考箭头摆放角度。默认为0,即水平摆放
             label='12m/s',           #箭头的补充:label的内容  +
             labelpos='E',            #label在参考箭头的哪个方向; S表示南边
             color = 'k',labelcolor = 'k', #箭头颜色 + label的颜色
             )

#加载地图
reader = cartopy.io.shapereader.Reader('D:/pythonProjec/20230206/xx.shp')
provinces = cartopy.feature.ShapelyFeature(reader.geometries(),crs=ccrs.PlateCarree(),
                                          edgecolor='k',
                                          facecolor='none',alpha=1)
ax.add_feature(provinces, linewidth=0.65, zorder=2)

ax.set_title("19-18-700")
plt.savefig("D:/pythonProjec/BTC/1918700.jpg",dpi=500)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2024-6-24 23:11:41 | 显示全部楼层
楼主,数据能提供下吗?谢谢。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表