Python氣象繪圖教程(十四)

2021-02-21 氣象學家

本節提要:圖例 Legend與colorbar

一、圖例Legend命令常用參數

作為成熟的科研圖表,圖例的重要性是不言而喻的。所謂一圖敵千言,在氣象科研領域,圖表是進行數據可視化的利器,而圖例是幫助閱讀者理解圖表信息的關鍵。繪圖庫matplotlib中專門闢出一個命令——Legend進行設置。下面首先介紹其常用關鍵字參數。loc
設置圖例位置,一般在圖表內部
fontsize
字體大小
markerscale
圖例標記相對於原始標記的相對大小
markerfirst
圖例在標籤左側,bool值控制
numpoints
圖例的標記數目
frameon
圖例邊框,bool值控制
fancybox
邊框是否圓邊
shadow
邊框陰影
framealpha
邊框透明度
edgecolor
邊框邊緣顏色
facecolor
邊框內部填色
ncol
圖例列數,int值
borderpad
邊框內邊距
labelspacing
圖例之間的垂直間距
handlelength
圖例的句柄長度
handleheight
圖例的句柄高度
handletextpad
圖例與句柄之間間距
columnspacing
列間距
title
圖例標題
bbox_to_anchor
指定圖例在軸的位置
在之前,我們製作了一個墒情圖,本次即以此圖展示legend命令。

兩圖相比較,修改了ncol為一列,修改了edgecolor為紅色,修改了facecolor為綠色,修改了framealpha為1,修改了fancybox為圓角。
其他參數命令,讀者可以自行實驗,在jupyter notebook中實驗是非常方便的。二、Legend的位置調節命令——loc與bbox_to_anchorLegend有兩個可以調節位置的命令,使用方式各不相同。loc是最常用的位置命令,兩種使用方式,一是使用0~10數字,二是使用字符命令如'best','right',center','upper right'等,這種圖例位置是在子圖內部的,可能會出現遮擋圖形的情況,所以就有bbox_to_anchor命令,這個命令類似於前面推薦的add_axes命令,指定的是圖例的絕對位置,不妨通過上一個圖片展示:
ax2.legend((bar1,bar2,line1,line2),('降水','蒸發','墒情','氣溫'),frameon=True,framealpha=1,ncol=1,shadow=True,bbox_to_anchor=(0,0))

可以看出,將絕對位置定為bbox_to_anchor=(0,0)後,圖例可以被放置在子圖外了。同樣的,可以放置到我們常見的圖例位置:
ax2.legend((bar1,bar2,line1,line2),('降水','蒸發','墒情','氣溫'),frameon=True,framealpha=1,ncol=1,shadow=True,bbox_to_anchor=(1.1,0.9))

注意,兩個命令並不是衝突的,可以放在同一句中調節,不會報錯。
還可以進行如下操作,bbox_to_anchor=(x1,y1,x2,y2),給予圖例框的起始絕對位置和結束絕對位置:
ax2.legend((bar1,bar2,line1,line2),('降水','蒸發','墒情','氣溫'),bbox_to_anchor=(0,-0.1,1.,-0.10),frameon=True,framealpha=1,ncol=2,shadow=True,mode="expand", borderaxespad=0.)

在mode=『expand』命令下,指定了起始和結束位置後,圖例框將被拉伸到最大,我目前沒有用到,可能有讀者需要。在前面,我們將每個圖例分別注釋了標籤,在需要的時候,還可以進行分類操作。大多數時候,我們通過最簡便的方法建立一個實驗圖(直接在繪製時設置label=,legend會自動生成圖例):
line1=plt.plot(x,y1,lw=2,ls="-",color='cyan',label='line1')line2=plt.plot(x,y2,lw=2,ls='--',color='k',label='line2')line3=plt.plot(x,y3,lw=2,ls=':',color='lightgreen',label='line3')scatter1=plt.scatter(x2,y4,c='orange',s=15,marker='*',label='scatter1')scatter2=plt.scatter(x2,y5,c='darkgray',s=19,marker='1',label='scatter2')scatter3=plt.scatter(x2,y6,c='darkturquoise',s=19,marker='h',label='scatter3')plt.title('這是總標題')plt.legend(title='這是圖例標題',bbox_to_anchor=(1,0.9),frameon=False,framealpha=0.75)

這種建立圖例的方法不能進行分類操作,所以通過在plt.legend(list1,list2)的方式建立圖例,一般來說list1代表繪製命令,list2裝載字符串作為名稱:
plt.legend([line1,line2,line3,scatter1,scatter2,scatter3],['line1','line2','line3','scatter1','scatter2','scatter3'])

plt.legend([(line1,line2,line3),scatter1,scatter2,scatter3],['這是合併的線','scatter1','scatter2','scatter3']

可以發現,雖然合併了,但是合併的圖例裡只有一根綠線了,這時需要引進新的模塊:
from matplotlib.legend_handler import HandlerLine2D, HandlerTupleplt.legend([(line1,line2,line3),scatter1,scatter2,scatter3],['這是合併的線','scatter1','scatter2','scatter3'],            handler_map={tuple: HandlerTuple(ndivide=None)},numpoints=1,            title='這是圖例標題',bbox_to_anchor=(1,0.9),frameon=False,framealpha=0.75)

這之後,合併的圖例能正常顯示了。當然散點圖也能進行分類處理:

在matplotlib中,由於legend命令的特性,無論plt.legend還是ax.legend,都只能在圖表中添加一個圖例,一般來說以最後一個legend命令繪製,前面都會被覆蓋,比如:
三個命令,最終只能出現(***)這個圖例。但是科研圖表存在需要多個圖例的情況,如果確實需要繪製時,可以通過ax.add_artist()命令添加。仍然以上一小節的圖為例。首先,我們將所有line通過ax.legend()命令繪製出來:
ax.legend([line1,line2,line3],['直線1','直線2','直線3'],numpoints=1,title='圖例一',bbox_to_anchor=(1,0.9),frameon=False,framealpha=0.75)

然後,from matplotlib.legend import Legend模塊導入,將其他散點和直方在Legend命令下添加,Legend()內部關鍵字參數與ax.legend()的關鍵字參數一致,最後,以ax.add_artist()添加到子圖上:
from matplotlib.legend import Legendlegend2=Legend(ax,[scatter1,scatter2,scatter3,bar1],['散點1','散點2','散點3','直方1'],title='圖例二',frameon=False,bbox_to_anchor=(1,0.3))ax.add_artist(legend2)

當然,你還可以增添三個乃至更多的圖例,讀者可自行推用。
在前面的推送中,介紹到散點圖的兩種使用方法:一種為以s為變量,固定顏色,通過散點直徑大小展示數據;一種是以顏色映射為變量,固定s,通過填色變化來展示數據。這兩種是最簡單的使用方式,進一步的,散點圖還可以將兩個都設置為變量,都展示數據的變化。
filename=r'C:\Users\lenovo\Desktop\累年降水數據.xlsx'df=pd.read_excel(filename)lon=df['lon']#讀入站點經度lat=df['lat']#讀入站點緯度rain_days=df['rain_days']#讀入各站點某年累計降水日數rains=df['precipitation']#讀入各站點某年累計降水量rain_size=(rain_days-10)**2#對累計降水日數進行處理,使散點大小均勻

然後繪製散點圖(添加地圖和站點名通過def create_map():繪製,這裡略去):
sca=ax.scatter(lon,lat,s=rain_size,c=rains,cmap='GnBu',alpha=0.75,edgecolor='k',label='none')

將處理過的累計降水日數傳入s,將累計降水量傳給color,設定cmap為'GnBu'。注意,最好能改變alpha小於1,因為散點存在互相重疊情況,不使散點透明,小散點可能被大散點完全覆蓋。edgecolor設為黑色在視覺上是最好的。

當然,目前缺乏重要的輔助圖例,除了製圖員,沒人知道這幅圖表達了什麼,所以接下來,介紹兩種添加輔助閱讀工具手段。
A、通過添加圖例表示圓圈大小含義、通過添加colorbar表示填色的含義
position=fig.add_axes([0.1,0.2,0.8,0.01])b=plt.colorbar(ax=sca,cax=position,extend='both',orientation='horizontal',shrink=0.3,label='累計降水量 $mm$',pad=0.1)

這樣就能展示填色的意義了,閱讀者能明白填色代表累計降水量,然後,通過如下命令生成圖例:
marker1=ax.scatter([],[],s=rain_size.min(),c='k',alpha=0.3)marker2=ax.scatter([],[],s=rain_size.max()/2,c='k',alpha=0.3)marker3=ax.scatter([],[],s=rain_size.max(),c='k',alpha=0.3)legend_markers=[marker1,marker2,marker3]labels=['30日','60日','90日']ax.legend(title='累計降水日',handles=legend_markers,          labels=labels,scatterpoints=1,frameon=False,          labelspacing=0.39,handletextpad=3,          bbox_to_anchor=(0.3,0.93))

前面三句就是生成三個圓圈的命令,因為通過兩個空列表生成的,所以不會顯示在主圖上,只能通過句柄命令(handles)傳入ax.legend(),這時你可以理解為等同於(為了方便理解如此解釋):ax.legend([line1,line2,line3],['直線1','直線2','直線3'])前一部分為圖例,後一部分為標籤。
前面的程序與A中完全相同,在第四節中已經講了如何建立多個子圖,這裡馬上就上手使用了,這次不使用colorbar展示顏色變化,而使用帶顏色的散點:
from matplotlib.lines import Line2Dcmap=plt.get_cmap('GnBu')levels=[40,60,80,100,120,140,160,180]ls = [Line2D(range(1), range(1), linewidth=0, color=cmap(v), marker='o', ms=(10)) for v in levels]ax.legend(ls,levels,frameon=False,bbox_to_anchor=(1.02,0.5),title='累計降水量($mm$)')

第一步獲取cmap,這裡和主圖的cmap一致。第二步劃分降水level。第三步生成我們的彩色圓點,這些彩色圓點實際上是帶著marker的plot線條,但是我們將其linewidth設為了0,線條被截去了。第四步傳入legend命令。

接著,使用前面提到的添加第二個圖例的方法,添加散點直徑圖例:
marker1=ax.scatter([],[],s=rain_size.min(),c='k',alpha=0.3)marker2=ax.scatter([],[],s=rain_size.max()/2,c='k',alpha=0.3)marker3=ax.scatter([],[],s=rain_size.max(),c='k',alpha=0.3)legend_markers=[marker1,marker2,marker3]labels=['30日','60日','90日']legend2=Legend(ax,title='累計降水日',handles=legend_markers,               labels=labels,scatterpoints=1,frameon=False,               labelspacing=0.39,handletextpad=3,               bbox_to_anchor=(1.1,0.98))ax.add_artist(legend2)

前面部分與方法A中的一致,但是我們已經在前面用ax.legend()命令繪製了一個圖例了,這時就只能用ax.add_artist(legend2)方法添加新的圖例。

通過這幅圖能看出什麼呢?可以看出恩施州降水日數和降水量高值區都集中在利川市,而鶴峰的日數和降水量都偏少。再看宣恩縣和恩施市,宣恩的降水日更少,但是降水量比恩施市多。

相關焦點

  • Python氣象繪圖教程(三)
    官網給出了很多符號樣式,可挑選你覺得好看的符號樣式即可(雖然我覺得沒幾個好看的):氣象上常用的有三線圖、五線圖。三線圖主要是日常氣象分析的氣壓、氣溫、溼度(或其他繪圖量)有時還會繪製降水柱狀圖。五線圖主要是展示春夏秋冬和年平均的變化關係。一張圖如果有更多的線條會使得界面凌亂不堪,不能用於科學分析。
  • Python氣象繪圖教程(六)
    其中一部分來自氣象家園網站的現成帖子。A、使用savefig(''picture name'')保存圖像文件時,保存的圖片是空白的。解決辦法:第一種,將savefig命令移動至plt.show()命令之前。第二種,查看命令是否為fig.savefig(),一般來說,使用了figure,ax命令後,plt.savefig()需要更改為fig.savefig()。
  • 利用Python對WRFout文件進行簡單繪圖
    還有這樣:關於namelist,其他的注意事項在言深深大佬的教程裡說得很詳細了,網絡上也有很多補充的文檔,就是在這個地方需要注意一下:我比較習慣用圓柱投影來畫圖(cartopy裡是PlateCarree()這個命令),所以是這麼寫namelist
  • Python氣象繪圖教程(四)
    plt.figure()   ###準備畫布###                 ③讀取數據                 ④ax=fig.add_subplot()   ###添加作圖區###                 ⑤繪製圖形                 ⑥plt.show()   ###展示圖形###畫布figure及其參數、
  • 「繪圖,讓科學生動起來」:Python-matplotlib繪圖(專題一)python環境搭建篇
    筆者寄語:各位好,從今天開始,「科學是什麼東東」將推出一個全新系列專題:採用時下最流行的python計算機設計語言,對其中的一個第三方繪圖庫,即matplotlib繪圖庫進行講解,並將其強大的繪圖與編程功能應用到數學函數,化學,地理,物理,教育等諸多領域。
  • python的繪圖利器--海龜繪圖turtle
    作為你學習python的第一個程序,樹哥決定直接來一個實戰乾貨程序:利用海龜turtle來畫一個奧運五環。這樣就既可以理解庫的概念和使用,又可以理解程序的基本概念。這個語句是個固定格式,有這句話畫完圖,繪圖窗口還保留,如果沒有這句話,繪圖窗口就直接關閉了,所以初期都加上就好了。
  • Excel學習教程 & Python全套教程
    各位小夥伴們,今天給大家分享兩個非常有用的資料:Excel學習教程和Python全套教程。
  • 如何用matplotlib繪圖呢?
    使用過python做數據分析的小夥伴都知道,matplotlib是一款命令式、較底層、可定製性強、圖表資源豐富、簡單易用、出版質量級別的python 2D繪圖庫。matplotlib算是python繪圖的元老級庫,類似程式語言裡的C語言。
  • 小白開始學Python最著名的繪圖庫
    今天就先了解一下Python中最著名的繪圖庫Matplotlib,看看到底如何做出漂亮的圖有的小夥伴不解,為啥叫它鼻祖的,因為其他的可視化的數據包都是從它演變而來,二次封裝的。Matplotlib本身是免費而且開源的,貌看一下感覺非常複雜,API超級多。
  • Python機器學習·微教程
    該教程共分為11小節。在這個教程裡,你將學會:如何處理數據集,並構建精確的預測模型使用Python完成真實的機器學習項目這是一個非常簡潔且實用的教程,希望你能收藏,以備後面複習!接下來進入正題~這個微課程適合誰學習?如果你不符合以下幾點,也沒關係,只要花點額外時間搞清楚知識盲點就能跟上。
  • MNE-Python的簡易中文教程簡單入門
    MNE-Python的下載安裝很簡單,具體可參考https://mne.tools/stable/install/mne_python.html#installing-python。Raw對象也自帶有繪圖方法,我們使用plot_psd()和plot()實現一些可視化功能。並且在交互式Python會話中,plot()是交互式的,允許一些編輯操作。我們在MNE中實例化一個ICA對象,調用其fit()方法傳入數據即可。同時ICA對象的exclude屬性提供了去除成分的傳參方案,plot_properties()提供了可視化的功能。
  • Python 繪圖庫 Matplotlib 入門教程
    (點擊上方公眾號,可快速關注)來源:強波的技術博客qiangbo.space/2018-04-06/matplotlib_l1/Matplotlib是一個Python語言的2D繪圖庫如果你已經有了本文的運行環境,將上面的代碼保存到一個文本文件中(或者通過Github獲取本文的源碼),然後通過下面的命令就可以在你自己的電腦上看到上面的圖形了:python3 test.py 注1:後面的教程中,我們會逐步講解如何定製圖中的每一個細節。例如:坐標軸,圖形,著色,線條樣式,等等。
  • 《簡明 Python 教程》微信版
    小編花了整整一天時間,終於把《簡明Python教程》整理到了公眾號裡。
  • 只要十分鐘,python繪圖神器turtle了解一下?
    python的強大在於它有許多的強大的庫,turtle就是其中之一。利用turtle,你可以進行交互式的繪畫,作為一個藝術白痴,想要畫一幅畫可能很困難,但是利用python的turtle庫,只需要幾行代碼你就能實現繪畫。
  • python教程
    python視頻教程     文章底部留言 序號 給您發送視頻教程連結或者加微信 bigzql 索要Python
  • 氣象編程 | 中國地圖shp文件和Python繪圖實例
    gmt-china.org/data/MeteoAI(zhangqibot)省級行政邊界含九段線https://cloud.tencent.com/developer/article/1484356整理後的shp文件連結: https://pan.baidu.com/s/1Di_mEd27LQ343mXdmZxdQg 提取碼: nkdePython繪圖示例
  • 全套免費的3D科研繪圖教程就在這裡!
    友情提示:Ⅰ、所有教程均為原創,未經允許不得擅自挪作他用;Ⅱ、每期連結的圖片還註明了教程中使用的主要方法和知識點(見下方圖片);Ⅲ、教程難度由簡入深,所用方法不一定是最便捷的有豐富的科研繪圖和培訓經驗,聯繫方式——QQ:244308002    WeChat:memorylhd更多問題可在微信後臺留言,或者加入我們的QQ學習交流群3D科研繪圖學習交流
  • python推薦 | 面向地學領域的Python庫匯總
    •csv, xlsx等格式:pandas你值得擁有,無論是氣象還是其他領域的類似格式數據,使用pandas可以解決你的常用操作。•HDF格式:pandas和h5py可以處理hdf5格式,PyHDF可以處理hdf4格式。
  • 第350期博士生創新論壇 | Python信息處理與繪圖
    浙大AI俱樂部聯合浙江大學博士生會給大家送教程啦!Python語言是目前推動數據科學如人工智慧、大數據、金融分析和機器學習算法實現等最為強大的動力引擎。通過此次活動,希望參與的同學能夠入門Python,並且利用Python結合機器學習相關算法對於數據、文本信息進行處理,同時,也能夠進行繪圖,從而在論文寫作過程與實驗過程中能夠使用。本次活動是博創論壇中少有的技能提升營,我們將從學生角度出發,著重新手教學!
  • Python微課 | Seaborn——Python優雅繪圖(上)
    Matplotlib:Python基礎繪圖包(本課中輔助繪圖)本節課內容與目的:通過官方文檔(Document)裡的現成示例學習Seaborn包,熟悉Seaborn繪圖背景的調節。示例2:男性女性用餐時間和用餐價格可視化學習內容:ggplot背景風格繪圖,柱狀圖。