本節提要:實用的matplotlib修改技巧
一、複習回顧
這些技巧都是在我仿製和自己畫圖時的總結,完全可用。其中一部分來自氣象家園網站的現成帖子。
A、使用savefig(''picture name'')保存圖像文件時,保存的圖片是空白的。
解決辦法:第一種,將savefig命令移動至plt.show()命令之前。第二種,查看命令是否為fig.savefig(),一般來說,使用了figure,ax命令後,plt.savefig()需要更改為fig.savefig()。
B、創建單子圖或多子圖時,標籤刻度字體過大互相重疊遮擋。
像這樣重疊,在matplotlib中,各部分的可調節性和靈活性是非常高的,這雖然在繪製大量圖片時會使得程序繁雜可讀性低,但是修改出來的圖片比原來的要精美。
這種圖要怎麼修改呢?
在軸刻度欄,無論是默認的刻度還是經緯刻度,都可以使用字典的方式進行調節。在前面的折線圖坐標中,我們已經引入了一部分:
當時我們就引用字典的方法修改了顏色和字體大小。
font={'size':20,'color':'red'}ax.set_xlabel('時間',fontdict=font)ax.set_ylabel('氣溫 ℃',fontdict=font)那麼,在引入了經緯度標籤之後,仍然可以通過字典的方式調節:
gl.xlabel_style={'size':10}gl.ylabel_style={'size':10}
這樣就美觀了。在matplotlib中,絕大部分你能想到的細節都能通過字典的方式進行調節,具體方式可自行深入探索。
C、色條的細節修改
色條是在繪製等值線填色圖時非常重要的輔助。同樣的,按照前面的介紹,他也是能夠使用字典的方式修改的,就拿上一幅圖舉例,我們給色條添加藍色的名稱,並將其刻度字體放大。
cb=plt.colorbar(cs,shrink=0.5)font={'size':50,'color':'b'}cb.set_label('溫度 \℃',fontdict=font)cb.ax.tick_params(labelsize=20)
當然我修改的有點誇張,不美觀了,字典的原理如此。所謂萬法皆通,在matplotlib中,你能想到的和字體大小顏色之類有關的基本能通過字典解決。
D、關於中文和負號的解決辦法
當我們繪圖時,新手很可能出現下面這種情況:
這是軟體的問題,需要在前面添加上:
plt.rcParams['font.sans-serif']=['SimHei']這樣就能解決中文輸出的問題。大部分新手能找到的教程也是這樣。是不是只能使用這樣的字體呢?答案是否定的,可通過兩個實例來驗證:
plt.rcParams['font.sans-serif']=['LiSu']
plt.rcParams['font.sans-serif']=['STXingkai']
上面一個修改為隸書,一個為行楷。可以看出,字體是可以修改的,具體可以修改的字體如下圖所示(圖源張若愚《Python科學計算》):
E、多子圖繪製時,出現colorbar和子圖擁擠錯誤排版的情況
前面已經介紹過matplotlib中添加子圖的多種多樣的方法,例如subplot、subplots、subplot2grid等方法,在大多數時候能滿足需求,但是添加色條時問題多多。
這種是默認的添加色條的辦法,可以看出,在使用subplot等添加色條時存在排版問題。有的同學可能提出我將色條橫著放在最下面,不就解決了,但是這樣的方式只能改變第四張圖:
orientation='horizontal'(使色條橫向)
所以,我們推薦使用簡書上ID:摸魚咯的解決方式,使用axes[i,j,m,n]的命令進行設置。
ax1 = fig.add_axes([0.019,0.60,0.5,0.5],projection=proj)ax2 = fig.add_axes([0.6,0.60,0.5,0.5],projection=proj)ax3 = fig.add_axes([0.019,0.08,0.5,0.5],projection=proj)ax4 = fig.add_axes([0.6,0.08,0.5,0.5],projection=proj)ax5=fig.add_axes([0.28, 0.03, 0.5, 0.017])這樣其實建立了五個子圖,前四個為畫四個月圖像,最後一個為存放色條。
axes[i,j,m,n]內部參數的具體意思為:i,j代表本子圖在figure中位置,表示距離figure左邊和下邊的距離。m,n為本子圖的形狀大小。具體參數需要讀者在繪製過程中微調。
F、繪製等值線填色圖時出現問題
新手會出現讀取了數據報錯的問題:
lon=df['lon']#經度lat=df['lat']#緯度tem=df['temp']ax.contourf(lon,lat,tem,levels=np.arange(6,9,0.3))TypeError: Input z must be a 2D array.
這是因為中國能下載到的一般是站點數據,站點數據不能再等值線填色圖中使用,需要對整個數據進行網格化,站點插值之後才能進行等值線的描繪。具體請參考優酷上OLDLee老師的教學視頻。
olon=np.linspace(108,111,110)olat=np.linspace(29,32,110)olon,olat=np.meshgrid(olon,olat)tem=df['temp']func=Rbf(lon,lat,tem,function='linear')tem_new=func(olon,olat)cs= ax.contourf(olon,olat,tem_new,levels=np.arange(6,9,0.3))下期預告:地理信息的添加——Cartopy介紹。
往期回顧:
Python氣象繪圖教程(一)
Python氣象繪圖教程(二)
Python氣象繪圖教程(三)
Python氣象繪圖教程(四)
Python氣象繪圖教程(五)
Python氣象繪圖教程特刊(一)