寒潮是筆者主要的研究方向,寒潮路徑作為寒潮重要的特征莲祸,是寒潮預(yù)報(bào)的重點(diǎn)之一蹂安,同樣的道理也適用在臺風(fēng)研究以及降水的水汽來源研究中。關(guān)于路徑的計(jì)算以及獲取方法(比如軌跡倒推锐帜,模型追蹤等等方法田盈,臺風(fēng)有自己現(xiàn)成的數(shù)據(jù)集,比如ibtracs數(shù)據(jù)集等等)并不在本文的介紹范圍之內(nèi)缴阎,本文主要介紹在獲取了相應(yīng)的路徑坐標(biāo)后允瞧,如何在圖中美觀的展現(xiàn)。
上圖展現(xiàn)了近40年東北亞區(qū)域的冬季冷空氣活動路徑,繪制這類圖需要的數(shù)據(jù)只需為每條路徑的N個(gè)三維坐標(biāo)點(diǎn)述暂,第一第二維分別為longitude和latitudee痹升,第三維則比較隨意,根據(jù)需要選擇畦韭,比如說需要體現(xiàn)高度疼蛾,那就用高度坐標(biāo),需要體現(xiàn)冷空氣強(qiáng)度艺配,那就用溫度數(shù)據(jù)察郁,水汽可以用相對濕度,臺風(fēng)也可以用速度等等转唉。
通常此類數(shù)據(jù)是由.txt(.csv)等格式存儲的皮钠,讀取和處理方法可參考我的“Python氣象數(shù)據(jù)處理與繪圖(1):數(shù)據(jù)讀取”,本文主要介紹繪圖部分赠法。
代碼
#以下幾行同先前文章所講鳞芙。使用時(shí)完全可以自定義函數(shù)進(jìn)行封裝,畫圖時(shí)直接調(diào)用期虾,避免每次畫地圖均需設(shè)置諸多要素。
proj = ccrs.PlateCarree(central_longitude=95)
leftlon, rightlon, lowerlat, upperlat = (0,180,0,90)
img_extent = [leftlon, rightlon, lowerlat, upperlat]
lon_formatter = cticker.LongitudeFormatter()
lat_formatter = cticker.LatitudeFormatter()
fig3 = plt.figure(figsize=(12,7))
f3_ax6 = fig3.add_axes([0.1, 0.1, 0.6, 0.5],projection = proj)
f3_ax6.set_extent(img_extent, crs=ccrs.PlateCarree())
f3_ax6.add_feature(cfeature.COASTLINE.with_scale('50m'))
f3_ax6.add_feature(cfeature.LAKES, alpha=0.5)
f3_ax6.set_xticks(np.arange(leftlon,rightlon+30,30), crs=ccrs.PlateCarree())
f3_ax6.set_yticks(np.arange(lowerlat,upperlat+30,30), crs=ccrs.PlateCarree())
f3_ax6.xaxis.set_major_formatter(lon_formatter)
f3_ax6.yaxis.set_major_formatter(lat_formatter)
#以下為核心代碼驯嘱,n為路徑條數(shù)镶苞,x,y,z分別為路徑的三個(gè)維度,任意一維由[n,t]構(gòu)成鞠评,比如說x[n,t]茂蚓,n為路徑數(shù),t指的是這一條路徑是由t個(gè)時(shí)刻點(diǎn)構(gòu)成剃幌。以此逐條路徑循環(huán)繪制
for i in range(n):
lon = x[i,:]
lat = y[i,:]
#注意聋涨,X,Y第二維均為:,而h為1:负乡,這是因?yàn)轭伾坏氖莾牲c(diǎn)之間連線的顏色牍白,m個(gè)點(diǎn),產(chǎn)生m-1個(gè)線段抖棘,因此顏色的設(shè)置為從1開始茂腥,或者從0開始到倒數(shù)第一個(gè),即為:-1切省,根據(jù)需要設(shè)置最岗。
h = z[i,1:]
#將X,Y轉(zhuǎn)置進(jìn)同一數(shù)組,兩兩匹配
points = np.array([lon, lat]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
#設(shè)置色標(biāo)的標(biāo)準(zhǔn)化范圍(即將Z維度的數(shù)據(jù)對應(yīng)為顏色數(shù)組)
norm = plt.Normalize(0, 5000)
#設(shè)置顏色線條朝捆,修改cmap調(diào)整colortable般渡,transform為地圖投影坐標(biāo)轉(zhuǎn)換
lc = LineCollection(segments, cmap='jet', norm=norm,transform=ccrs.PlateCarree())
lc.set_array(h)
#繪制線條
line = f3_ax6.add_collection(lc)
#以下為色標(biāo)添加
position=fig3.add_axes([0.21, 0.03, 0.35, 0.025])
fig3.colorbar(line,cax=position,orientation='horizontal',format='%.1f')
當(dāng)然根據(jù)需要,也可以直接繪制兩維的軌跡,即取消掉顏色數(shù)組驯用,用最簡單的plot語句脸秽,循環(huán)繪制即可。
特別注意
有一個(gè)陷阱需要大家注意的是晨汹,當(dāng)軌跡跨越了東西半球時(shí)豹储,即穿越了0°或者360°經(jīng)線時(shí),它的連接方式是反向繞一圈淘这,比如下圖所示剥扣,你想要藍(lán)色的軌跡,然而很有可能得到綠色的铝穷,這是因?yàn)槟愕木W(wǎng)格數(shù)組的邊界是斷點(diǎn)钠怯,系統(tǒng)不會自動識別最短路徑,只會在數(shù)組中直接想連曙聂,因?yàn)檫@不是循環(huán)數(shù)組晦炊。
我目前的解決辦法是這樣的:如果你的數(shù)據(jù)是0°-360°格式,那么變?yōu)?180°-180°的格式宁脊,反之相互轉(zhuǎn)換断国。但是如果你的數(shù)據(jù)兩種都出現(xiàn)了斷點(diǎn),也就是繞了地球一圈多榆苞,那無論怎樣都么得辦法了稳衬,我目前的思路是將數(shù)據(jù)轉(zhuǎn)換成極坐標(biāo)數(shù)據(jù)格式,理論上是可行的坐漏,CARTOPY的繪圖也是支持極坐標(biāo)數(shù)據(jù)的薄疚,具體實(shí)施還需要再試試。