Python-气象-大气科学-可视化绘图系列(一)——利用xarray读取netCDF文件并画图(代码+示例)

本文介绍了一种使用Python的xarray、matplotlib和cartopy库进行气象数据可视化的方法,展示了如何从NetCDF文件中读取强对流概率预报数据,并在地理坐标系下绘制等值线填充图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文原创链接:https:////www.cnblogs.com/zhanling/p/12192978.html

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


ds = xr.open_dataset('2039071310.003.nc')
t = ds['value']
lons = ds.lon.data
lats = ds.lat.data
temp = xr.DataArray(t.data.T, coords=[lats,lons], dims=['latitude','longitude'])

# 创建画图空间
proj = ccrs.PlateCarree() #创建投影
fig = plt.figure(figsize=(16,9)) #创建页面
ax = fig.subplots(1, 1, subplot_kw={'projection': proj}) #子图
# 设置地图属性:加载国界、海岸线、河流、湖泊
ax.add_feature(cfeat.BORDERS.with_scale('50m'), linewidth=0.8, zorder=1)
ax.add_feature(cfeat.COASTLINE.with_scale('50m'), linewidth=0.6, zorder=1)
ax.add_feature(cfeat.RIVERS.with_scale('50m'), zorder=1)
ax.add_feature(cfeat.LAKES.with_scale('50m'), zorder=1)
# 设置网格点属性
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
linewidth=1.2, color='k', alpha=0.5, linestyle='--')
gl.xlabels_top = False #关闭顶端标签
gl.ylabels_right = False #关闭右侧标签
gl.xformatter = LONGITUDE_FORMATTER #x轴设为经度格式
gl.yformatter = LATITUDE_FORMATTER #y轴设为纬度格式
# 设置colorbar
cbar_kwargs = {
'orientation': 'horizontal',
'label': 'Potential',
'shrink': 0.8,
}
# 画图
levels = np.arange(0,1,0.1)
temp.plot.contourf(ax=ax, levels=levels, cmap='Spectral_r',
cbar_kwargs=cbar_kwargs, transform=ccrs.PlateCarree())
plt.savefig('test.jpg')


---------------------
 

示例效果(强对流概率预报结果)
---------------------
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:斩羚_HermionX

 

python详细编写:有从北纬54-56经度81到83,空间长度为0.1度,从1994年到2023年7月1到31号0-23时的24个温度数据。数据保存在txt文档。坐标点大小是21*21,(54,81)对应的坐标是(1,1),(54,81.1)对应的坐标是(1,2),(54,81.2)对应的坐标是(1,3),...,(54,83)对应的坐标是(1,21),...,(54.1,81)对应的是(2,1),(54.1,81.1)对应的是(2,2),(54.1,81.2)对应的是(2,3),...,(54.1,83)对应的是(2,21),以此类推(56,81)对应的是(21,1),(56,81.1)对应的是(21,2),(56,81.2)对应的是(21,3),...,(56,83)对应的是(21,21)。第步建向量组ξ:在坐标点(1,1)的数据是(54,81)对应的温度,ξ1=(ξ0,1,ξ1,1,ξ2,1,ξ3,1...ξ23,1),ξ2=(ξ0,2,ξ1,2,ξ2,2,ξ3,2...ξ23,2),ξ3=(ξ0,3,ξ1,3,ξ2,3,ξ3,3...ξ23,3)...ξ31=(ξ0,31,ξ1,31,ξ2,31,ξ3,31...ξ23,31),ξ=(ξ1,ξ2,ξ3...ξ31)这里的ξ大小为31*21, ξ1,ξ2...ξ31是每年7月份1- 31号,里面包含的0-23的24个元素是每隔小时的气温。以此类推,这样的坐标点有21*21个,k,l=1,2,..21。再代入1994-2023年的数据。第二步求加权方差的计算:M(ξ-)*(ξ-)^T=∑,这里∑的大小为31*31是托普利兹矩阵。第三步求均值 (1/30)*∑n=1,...,30*((1/31)*∑i=1,...,31*ξi,n(k,l))=Mξ。k,l=1,..,21,这里k,l表示坐标点。(1/30)*∑n=1,...,30*((1/31)*∑i=1,...,31*ξi,n(k,l)) 表示双重求和的平均值。从坐标(1,1)直到坐标(21,21)的ξ,对从1到31天进行求和,除以31来计算平均值。对n从1到30(1994-2023共30年)求和除以30来计算平均值。Mξ=(μ...μ)总共31个μ。μ=(μ1,μ2...μ24).Mξ大小是744。坐标点(k,l)(k,l)为Mξ在k,l坐标点的值。第四步M(ξ-)*(ξ-)^T= Mξ(ξ^T) - Mξ*M(ξ^T )。求Mξ(ξ^T)((ξ^T))(h)=(1/30)*∑n=1,...,30*((1/(31-h))*∑i=1,...,(31-h)*ξi,n*(ξi+h,n)^T),h=0,1,...,30。(ξi,n)这里的i表示天数,1到31。n表示年数,从1到30(1994-2023共30年).ξi+h,n这里的i+h也表示天数,n表示年数 ,h为0到30。Mξ(ξ^T) 表示矩阵Mξ与矩阵ξ的转置的乘积.第五步求(1/30)*∑n=1,...,30*((1/31)*∑i=1,...,31*ξi,n验证(1/30)*∑n=1...30*((1/31)*∑i=1,...,31*ξi,n是否等于μ,μ=(μ1,μ2...μ24).第六步求R.R=(R0 R1 R2...R30; R1^T, R0 R1...R29;...;R30^T R29^T...R0),其中R0=((ξ^T))(h=0)-μ*(μ^T),R1=((ξ^T))(h=1)-μ*(μ^T),R2=((ξ^T))(h=2)-μ*(μ^T)...Rk=((ξ^T))(h=k)-μ*(μ^T).R是个31x31的矩阵,由R0到R30(大小为24x24)组成.Mξ(ξ^T)(h) 表示矩阵Mξ与矩阵ξ的转置的乘积,乘积中的元素是由数据进行求和和平均值计算得到。第六步重新给ξ添加上下标的值,上标是i,n,下标是k,I.i是1~31号,n是1~30年.k,l是坐标点(21*21)(kl)=(1/30)*∑n=1...30*((1/31)*∑i=1...31*ξi,n,k,l). A=(1/30)*∑n=1...30*((1/31)*∑i=1...31*ξi,n,k1,l1*ξi,n,k2,l2)-μk1,l1*μk2,l2.其中ξk1,l1,ξk2,l2是每天中的任意两个时间点的温度。每天任选两个时间点的温度,总共31(31天)*30()对。第七步画图。在21*21的坐标中中点是(11,11),找到由中点到坐标中任意点的相关系数画图呈现出来。
03-11
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值