畫子圖的教程網上一搜一大堆,不過我在畫的時候還是出了點奇奇怪怪的問題,依然是聊一聊我遇到的問題,儘管最終呈現效果還行,但是還是被幾個小問題卡住了,比如共用坐標軸設置了跟沒設置一樣,之後再找找大佬問一下吧。。。
大概的思路和此前一樣,利用函數和循環來做重複的工作,不過由於存在子圖和共用colorbar的情況,使用了一下返回參數之類的小技巧XD,我感覺這些還是挺好用的(抬頭挺胸)。
繼續是用EAR5 hourly data on pressure levels from 1979 to present的再分析資料,繪製了200hPa、500hPa、700hPa和850hPa的相對溼度和風場。
首先,我們要新建一個大的畫布,設置好它的大小和解析度:
fig = plt.figure(figsize=(12,8),dpi=150)
我們需要畫同一時刻四個不同層次,因此我們在這個大畫布裡設置四個子圖,給它們各自起一個名字:
ax1 = plt.subplot(221, projection = proj)
ax2 = plt.subplot(222, projection = proj)
ax3 = plt.subplot(223, projection = proj)
ax4 = plt.subplot(224, projection = proj)
(這裡沒有用subplots()是因為它好像不支持ccrs.PlateCarree()的投影方式,我就只能這樣來做了。而且不能用這個新建子圖的方式也讓我沒辦法令子圖共用坐標軸,不知道具體是哪裡出了問題。。。)
但是,在調用函數的時候,當然還是名字都一樣好寫一點咯~只畫4層情況的話,我使用了range來控制讀取的層次,那麼,如何將有規律的名字字符串轉換為變量的名字,再傳入自定義函數中呢?我使用了locals()來達成目的。
for lev in range(0,4):
r = obj['r'][0][lev][:][:]
u = obj['u'][0][lev][:][:]
v = obj['v'][0][lev][:][:]
the_string = f'ax{lev+1}'
ax = locals()[the_string]
ac = RHLevel(r, u, v, ax, lev)
為什麼要令函數等於「ac」呢?由於四張圖片所使用的填色規則都是一樣的,為了看起來順眼,只需要一條colorbar作為圖例會好很多。所以,我們可以將畫相對溼度的語句傳出,在循環的外部利用該信息繪製整張圖的colorbar。
def RHLevel(r, u, v, ax, lev):
.
ac = ax.contourf(lons[248:288,420:480],lats[248:288,420:480],r[248:288,420:480],levels=np.arange(60,110,10),
cmap='Greens',extend='both', alpha=0.9)
return ac
由於返回了ac的信息,所以在調用函數之後該函數是有一個「結果」的,可以為這個結果「起名」,這樣就可以在循環外用傳遞出來的結果來自定義colorbar了:
ac = RHLevel(r, u, v, ax, lev)
cb = fig.colorbar(ac, cax = cbar_ax,orientation='horizontal',spacing='proportional')
然後,就可以利用colorbar指令來定義它的位置、方向了,在這裡,l, b, w, h分別是指該colorbar的左側起始點、下側起始點、寬度和高度,數字則是百分比,比如說0.25是指大畫布的寬的0.25倍:
l,b,w,h = 0.25, 0.05, 0.5, 0.02
rect = [l,b,w,h]
cbar_ax = fig.add_axes(rect)
cb = fig.colorbar(ac, cax = cbar_ax,orientation='horizontal',spacing='proportional')
為了標出不同圖片所對應的層次,我們可以在函數中就給每一個子圖設置一個小標題。loc=''可以設置該標題的對齊位置,在這裡標題向左對齊。
ax.set_title(f'{level[lev]}hPa',fontsize=12,loc='left')
在大圖(循環外)中設置整張圖的標題(和子圖標題不一樣噢),具體有什麼區別可以搜一下fig/ax/plt的區別,有不少文章都講得很詳細:
plt.suptitle(f'2020年5月21日00時(世界時)各層相對溼度與風場',fontsize=18)
這次用到的新東西大概就是這些,感謝你的閱讀!
敬請各位大佬批評指正_(:3
目前已有220+位成員,
快快加入吧!
近40+位嘉賓,
查看嘉賓信息,
根據嘉賓的擅長領域提問、探討,
不止於氣象。
1.提供純粹小範圍的交流空間,高質量信息;
2.分享氣象相關領域最新資訊並進行探討;
3.集中且有深度地回復大家提出的各種問題;
4.結識國內外氣象圈志趣相投的本碩博朋友;
5.獲取就業資訊和工作內推資格;
6.了解學術相關動態,並且探討相關細節;
7.提供相關氣象業務需求對接;
8.為考研/博、導師選擇等提供指導意見;
9.分享學術文章、專業書籍等資源;
10.閒聊氣象人的生活、工作、家庭等等;
.
歡迎加入氣象學家交流群
請備註:姓名/暱稱-單位/學校-研究方向
(未備註的不通過申請)