




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第python对站点数据做EOF且做插值绘制填色图目录前言读取存储的数据插值EOF处理定义绘图函数并绘图展示结果总结
前言
读取站点资料数据对站点数据进行插值,插值到规则网格上绘制EOF第一模态和第二模态的空间分布图绘制PC序列
关于插值,这里主要提供了两个插值函数,一个是一般常用的规则网格插值:
griddata
另一个是metpy中的:
inverse_distance_to_grid()
本来只是测验一下不同插值方法,但是发现两种插值方法的结果差别很大,由于对于站点数据处理较少,所以不太清楚具体原因。如果有知道的朋友可以告知一下,不甚感谢!
本次数据存储的文件格式为.txt,读取的方法是通过pandas.read_csv()
同时,之前一直尝试使用proplot进行绘图,较长时间不用matplotlib.pyplot绘图了,也当做是复习一下绘图过程。
绘图中的代码主要通过封装函数,这样做的好处是大大减少了代码量。
导入必要的库:
fromeofs.standardimportEof
importmatplotlib.pyplotasplt
importnumpyasnp
fromerpolateimportgriddata
importpandasaspd
importmatplotlib.pyplotasplt
importcartopy.crsasccrs
importcartopy.featureascfeature
fromcartopy.mpl.tickerimportLongitudeFormatter,LatitudeFormatter
fromerpolateimportinverse_distance_to_grid
出现找不到库的报错,这里使用condainstallpackagename安装一下就好
读取存储的数据
#####################readstationdata##########################################
path=r'D:/data.txt'
file=pd.read_csv(path,sep="\t",
header=None,
names=['station','lat','lon','year','data'],
na_values=-99.90)
data=file['data'].to_numpy()
lon=file['lon'].to_numpy()
lat=file['lat'].to_numpy()
year=file['year'].to_numpy()
station=file['station'].to_numpy()
year_max=np.max(year)
year_min=np.min(year)
year_range=np.arange(year_min,year_max+1,1)
data_all=data.reshape(70,53)
lon_all=lon.reshape(70,53)/100
lat_all=lat.reshape(70,53)/100
lon_real=lon_all[:,0]
lat_real=lat_all[:,0]
这里将读取的数据全部转为array格式,方便查看以及后续处理。本来存储的文件中是没有相关的经度、纬度、站点、时间的名称的,这里我是自己加在上面方面数据读取的。
本次处理的数据包含70个站点,53年
插值
#####################interpdata##########################################
###interpdatatotargetgrid
###settargetgrid
lon_target=np.arange(115,135.5,0.5)
lat_target=np.arange(38,55.5,0.5)
x_t,y_t=np.meshgrid(lon_target,lat_target)
z=np.zeros((len(year_range),lat_target.shape[0],lon_target.shape[0]))
foriinrange(len(year_range)):
print(i)
#z[i]=inverse_distance_to_grid(lon_real,lat_real,
#data_all[:,i],
#x_t,y_t,r=15,min_neighbors=3)
z[i]=griddata((lon_real,lat_real),
data_all[:,i],
(x_t,y_t),method='cubic')
这里显示了使用griddata()的插值过程,metpy的过程注释掉了,需要测试的同学之间取消注释即可。
注意点:插值过程需要先设置目标的插值网格。
EOF处理
#计算纬度权重
lat_new=np.array(lat_target)
coslat=np.cos(np.deg2rad(lat_new))
wgts=np.sqrt(coslat)[...,np.newaxis]
#创建EOF分解器
solver=Eof(z,weights=wgts)
eof=solver.eofsAsCorrelation(neofs=2)
#此处的neofs的值是我们需要的空间模态数
pc=solver.pcs(npcs=2,pcscaling=1)#方差
var=solver.varianceFraction(neigs=2)
这里没啥好说的,需要几个模态自由选择即可
定义绘图函数并绘图
#####################defplotfunction##########################################
defcontourf(ax,i,level,cmap):
extents=[115,135,35,55]
ax.set_extent(extents,crs=proj)
ax.add_feature(cfeature.LAND,edgecolor='black',facecolor='silver',
ax.add_feature(cfeature.LAKES,edgecolor='black',facecolor='w',
ax.add_feature(cfeature.BORDERS)
xtick=np.arange(extents[0],extents[1],5)
ytick=np.arange(extents[2],extents[3],5)
ax.coastlines()
tick_proj=ccrs.PlateCarree()
c=ax.contourf(lon_target,lat_target,eof[i],
transform=ccrs.PlateCarree(),
levels=level,
extend='both',
cmap=cmap)
ax.set_xticks(xtick,crs=tick_proj)
ax.set_xticks(xtick,crs=tick_proj)
ax.set_yticks(ytick,crs=tick_proj)
ax.set_yticks(ytick,crs=tick_proj)
ax.xaxis.set_major_formatter(LongitudeFormatter())
ax.yaxis.set_major_formatter(LatitudeFormatter())
plt.yticks(fontproperties='TimesNewRoman',size=10)
plt.xticks(fontproperties='TimesNewRoman',size=10)
ax.tick_params(which='major',direction='out',
length=4,width=0.5,
pad=5,bottom=True,left=True,right=True,top=True)
ax.tick_params(which='minor',direction='out',
bottom=True,left=True,right=True,top=True)
ax.set_title('EOF'+str(i),loc='left',fontsize=15)
returnc
defp_line(ax,i):
ax.set_title('pc'+str(i)+'',loc='left',fontsize=15)
#ax.set_ylim(-3.5,3.5)
ax.axhline(0,line)
ax.plot(year_range,pc[:,i],color='blue')
ax.set_ylim(-3,3)
#####################plot##########################################
fig=plt.figure(figsize=(8,6),dpi=200)
proj=ccrs.PlateCarree()
contourf_1=fig.add_axes([0.02,0.63,0.5,0.3],projection=proj)
c1=contourf(contourf_1,0,np.arange(0.7,1,0.05),plt.cm.bwr)
plot_1=fig.add_axes([0.45,0.63,0.5,0.3])
p_line(plot_1,0)
contourf_2=fig.add_axes([0.02,0.15,0.5,0.3],projection=proj)
c2=contourf(contourf_2,1,np.arange(-0.5,0.6,0.1),plt.cm.bwr)
plot_2=fig.add_axes([0.45,0.15,0.5,0.3],)
p_line(plot_2,1)
cbposition1=fig.add_axes([0.16,0.55,0.22,0.02])
cb=fig.colorbar(c1,cax=cbposition1,
orientation='horizontal',format='%.1f')
cb.ax.tick_params(which='both',direction='in')
cbposition2=fig.add_axes([0.16,0.08,0.22,0.02])
cb2=fig.colorbar(c2,cax=cbposition2,
orientation='horizontal',format='%.1f')
cb2.ax.tick_params(which='both',direction='in')
plt.show()
这里将大部分重复的绘图代码,进行了封装,通过封装好的函数进行调用,大大简洁了代码量。相关的封装过程之前也有讲过,可以翻看之前的记录。
展示结果
使用griddata的绘图结果:
使用metpt插值函数的结果:
附上全部的绘图代码:
#-*-coding:utf-8-*-
CreatedonFriSep2317:46:422025
@author:Administrator
fromeofs.standardimportEof
importmatplotlib.pyplotasplt
importnumpyasnp
fromerpolateimportgriddata
importpandasaspd
importmatplotlib.pyplotasplt
importcartopy.crsasccrs
importcartopy.featureascfeature
fromcartopy.mpl.tickerimportLongitudeFormatter,LatitudeFormatter
fromerpolateimportinverse_distance_to_grid
#####
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届鱼台县数学三上期末检测模拟试题含解析
- 驾驶员培训课件
- 经济法概论考试辅导技巧试题及答案
- 2025年工程项目管理深度思考试题及答案
- 2024年水利水电工程科研方向试题及答案
- 水利水电工程能力提升训练试题及答案
- 2025年中级经济师考试答案与试题解析
- 高新技术产品合作协议书
- 生态环境保护政策法规知识竞赛题
- 市场营销消费者行为知识点测试
- 2025年黄山旅游发展股份有限公司春季招聘75人笔试参考题库附带答案详解
- 《酒店业运营管理》课件
- 2025年全国保密教育线上培训考试试题库及参考答案(典型题)带答案详解
- 项目管理咨询合同协议
- 辽宁省名校联盟2025年高三5月份联合考试化学及答案
- 2024年河北省邯郸县事业单位公开招聘村务工作者笔试题带答案
- 喝酒受伤赔偿协议书模板
- 2025年广东广州市高三二模高考英语试卷试题(含答案详解)
- 2025年中国公务车行业市场深度评估及投资策略咨询报告
- 铁路客运安检员应知应会考试题库300题(含答案)
- 雕像迁移 施工方案
评论
0/150
提交评论