




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 尊重話題班會課件
- 2024年湖南長沙中考真題及答案
- 水粉教學課件兒童
- 片段教學課件一等獎
- 智能化生產廠房施工合同十項應用
- 茶園土地流轉與種植承包合同
- 車用起重機租賃及設備操作規范培訓合同
- 餐飲服務員勞動合同合同解除通知協議
- 中醫正骨教學課件
- 無人駕駛車輛通信協議與網絡安全研究考核試卷
- 《人工智能對招聘的影響研究6000字(論文)》
- GB/T 39866-2021建筑門窗附框技術要求
- GB/T 3836.2-2021爆炸性環境第2部分:由隔爆外殼“d”保護的設備
- GB/T 31586.1-2015防護涂料體系對鋼結構的防腐蝕保護涂層附著力/內聚力(破壞強度)的評定和驗收準則第1部分:拉開法試驗
- 關節脫位患者的護理-關節脫位患者的護理(外科護理ppt)
- 產品合格證模板-合格證模板樣本
- 水泵試運行調試記錄
- 半導體中載流子的統計分布和計算
- 組織部處級干部培訓審計財經紀律課件
- 史上最全最權威婦產科icd編碼培訓【版】課件
- 心血管診治與搶救標準操作規程(SOP)
評論
0/150
提交評論