氣象繪圖加強版(三)——柱狀圖

2021-03-06 氣象學家

本節提要:matplotlib中的柱狀圖系列,bar、barh繪圖函數的常見參數與應用實例。

一、簡談柱狀圖

柱狀圖和折線圖在展示時間序列時原理類似,但是視覺效果是不一樣的。折線圖首先給予讀者趨勢的變化,然後是數量的變化;柱狀圖首先給讀者數量的變化,然後才是趨勢的變化。
柱狀圖在商務圖表上用的比較多,比如經濟、社調報告。氣象由於研究方法的特性,對摺線圖和等值線圖運用偏多,於是柱狀圖最常用的就是降雨量的可視化,另外一些值需要比較大小或變化時也可以使用。

柱狀圖的繪製依靠兩個命令ax.bar( )、ax.barh( ),其中前一個繪製出柱體是豎直的,後一個的柱體是水平的。bar柱狀圖的常用參數
x
一般為橫軸的坐標序列
y (height)
一般為縱軸的數值序列
import matplotlib.pyplot as pltimport numpy as npimport matplotlib.ticker as mtickerplt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=Falsedef sample_data():    x=np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])    y=np.array([11,14,18,2,16,4,15,3,19,17,4,11,1,18,14,3,13,19,2,3])    return x,yx,y=sample_data()fig=plt.figure(figsize=(4,2),dpi=500)ax1=fig.add_axes([0,0,1,0.4])ax2=fig.add_axes([0,0.5,1,0.4])ax1.bar(x,y,color='tab:green')ax2.bar(x,y,color='tab:blue')ax1.set_ylim(0,20)ax1.tick_params(axis='both',which='both',direction='in')ax1.xaxis.set_major_locator(mticker.MultipleLocator(5))ax1.yaxis.set_minor_locator(mticker.MultipleLocator(2))ax2.set_ylim(0,20)ax2.tick_params(axis='both',which='both',direction='in')ax2.xaxis.set_major_locator(mticker.MultipleLocator(5))ax2.yaxis.set_minor_locator(mticker.MultipleLocator(2))plt.show()

ax1.bar(x,y,width=0.75)ax2.bar(x,y,width=0.25)

ax1.bar(x,y,bottom=2)ax2.bar(x,y,bottom=10)

ax1.bar(x,y,edgecolor='r')ax2.bar(x,y,edgecolor='k')

ax1.bar(x,y,linewidth=5,edgecolor='k')ax2.bar(x,y,linewidth=2.55,edgecolor='k')

xerr,yerr
誤差線
ecolor
誤差線顏色
capsize
誤差線帽長度
ax1.bar(x,y,yerr=True,ecolor='r',capsize=1)ax2.bar(x,y,xerr=True,ecolor='tab:green',capsize=3)

ax1.bar(x,y,hatch='xxx')ax2.bar(x,y,hatch='*')

ax1.bar(x,y,color='tab:green',alpha=0.5)ax2.bar(x,y,color='tab:green',alpha=0.1)

本節主要簡單介紹柱狀圖的一些實用繪製方法:

A、如何使柱體在區分正負值(特別是距平),或者突破某一限制值柱體的顏色能夠不一致

只需要一個np.where( )命令即可完成,這個命令在前面已經介紹過了,這裡也可以用,看不懂就跑代碼編代碼。

import matplotlib.pyplot as pltimport numpy as npimport matplotlib.ticker as mtickerplt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=Falsedef sample_data():    x=np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,               22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,               41,42,43,44,45,46,47,48,49,50])    x2=np.array([1,2,3,4,5])    y1=np.array([11,14,18,2,16,-4,-15,3,19,17,-4,11,20,18,14,3,13,19,2,3,16,15,12,                10,4,-2,-4,-11,-18,-17,-3,5,9,15,17,8,9,16,14,11,-8,5,17,6,-9,-5,11,                -7,-2,10])    y2=np.array([14,4,6,14,18,15,19,21,-9,-6,-4,-2,-1,-3,-5,-6,-8,1,11,9,15,13,17,                19,10,4,6,9,2,12,11,8,-7,-9,5,5,4,15,12,13,-9,2,1,4,11,15,17,8,11,16])    y3=np.array([1120,1230,1190,1340,1590,1180,1390,1520,1690,1370,1210,1550,1555,1320,1221,1421,                1321,1532,1432,1222,1243,1543,1121,1672,1389,1567,1678,1224,1521,1790,1810,1146,                1356,1455,1789,1567,1234,1120,1675,1879,1800,1567,1235,1786,1346,1345,1789,1435,1567,1333])    y4=np.array([24,27,29,35,33,21])    y5=np.array([14,24,27,19,30])    return x,x2,y1,y2,y3,y4,y5x,x2,y1,y2,y3,y4,y5=sample_data()fig=plt.figure(figsize=(5,4),dpi=600)ax1=fig.add_axes([0,0,1,0.4])ax2=fig.add_axes([0,0.5,1,0.4])ax1.bar(x,y1,color=np.where(y1>0,'tomato','tab:blue'))ax2.bar(x,y2,color='k')ax1.set_ylim(-20,25)ax1.tick_params(axis='both',which='both',direction='in')ax1.yaxis.set_minor_locator(mticker.MultipleLocator(5))ax1.set_xlabel('時刻')ax1.set_ylabel('數值')ax2.set_ylim(-20,25)ax2.tick_params(axis='both',which='both',direction='in')ax2.yaxis.set_minor_locator(mticker.MultipleLocator(1))ax2.set_xlabel('時刻')ax2.set_ylabel('數值')plt.title('柱狀圖')plt.savefig('a',bbox_inches='tight')plt.show()

fig=plt.figure(figsize=(5,2),dpi=500)ax=fig.add_axes([0,0,1,1])ax.bar(x,y3,color=np.where(y3>1600,'tomato','tab:blue'))ax.axhline(y=1600,c='k',ls=':',lw=1)ax.set_ylim(1000,2000)ax.tick_params(axis='both',which='both',direction='in')ax.yaxis.set_minor_locator(mticker.MultipleLocator(100))ax.text(45,1650,'某個限定值')ax.set_title('限值變色')plt.savefig('a',bbox_inches='tight')plt.show()

B、如何並列多個數據(即類似第一節圖二)

其實就是把每個柱體的橫坐標挪動一下,我的數據比較小,所以是手動挪動,如果超過三種,最好用公式來挪動。

fig=plt.figure(figsize=(3,1.5),dpi=600)#添加畫布等ax=fig.add_axes([0,0,1,1])bar1=ax.bar(x2-0.22,y4,width=0.45)bar2=ax.bar(x2+0.23,y5,width=0.45)ax.set_title('並列柱狀圖',fontsize=10)ax.set(xlim=(0,7),ylim=(0,40))ax.tick_params(axis='both',which='both',direction='in')ax.yaxis.set_minor_locator(mticker.MultipleLocator(5))

C、如何在柱體頭部標值

可以手動讀取,也可以參考官網的方法,獲得當前柱體高度,然後標值

fig=plt.figure(figsize=(3,1.5),dpi=600)ax=fig.add_axes([0,0,1,1])bar1=ax.bar(x2-0.22,y4,width=0.45)bar2=ax.bar(x2+0.23,y5,width=0.45)ax.set_title('並列柱狀圖',fontsize=10)ax.set(xlim=(0,7),ylim=(0,40))ax.tick_params(axis='both',which='both',direction='in')ax.yaxis.set_minor_locator(mticker.MultipleLocator(5))def autolabel(rects):    for rect in rects:        height = rect.get_height()        ax.annotate('{}'.format(height),                    xy=(rect.get_x() + rect.get_width() / 2, height),                    xytext=(0, 3),                      textcoords="offset points",                    ha='center', va='bottom')autolabel(bar1)autolabel(bar2)

D、黑白刊物投稿

現在很多其實已經是彩色刊物了,但是仍然留在此處參考。

一般繪製圖片時,選取在色盤上成對角關係的顏色,列印成黑白的照片後仍然可以清晰的分辨每種柱體;或者使用前面提到的關鍵字參數hatch來改變內部填充樣式分辨柱體。

bar1=ax.bar(x2-0.22,y4,edgecolor='k',facecolor='none',hatch='*',width=0.45)bar2=ax.bar(x2+0.23,y5,edgecolor='k',facecolor='none',hatch='/',width=0.45)

E、堆積柱狀圖

這個圖的繪製要用到bottom參數,將第二個bar的下界設定為第一個bar高度值

fig=plt.figure(figsize=(3,1.5),dpi=600)ax=fig.add_axes([0,0,1,1])bar1=ax.bar(x2,y4)bar2=ax.bar(x2,y5,bottom=y4)ax.set_title('堆積柱狀圖',fontsize=10)ax.set(xlim=(0,6.5),ylim=(0,80))ax.tick_params(axis='both',which='both',direction='in')ax.yaxis.set_minor_locator(mticker.MultipleLocator(5))

F、給柱狀圖添加圖例

使用legend( )命令來給柱狀圖添加圖例

fig=plt.figure(figsize=(4,2),dpi=600)ax=fig.add_axes([0,0,1,1])width=0.45bar1=ax.bar(x2-width/2,y4,width)bar2=ax.bar(x2+width/2,y5,width)ax.legend([bar1,bar2],['藍色柱形','橙色柱形'])

參考資料:

1961至2010 年利川市極端氣溫變化分析  , 張成平, 資源與環境科學

人類活動排放的CO及氣溶膠對20世紀70年代末中國東部夏季降水年代際轉折的影響  ,王歡 李棟梁 ,氣象學報

集合柱狀圖與標記數值:https://matplotlib.org/gallery/lines_bars_and_markers/barchart.html#sphx-glr-gallery-lines-bars-and-markers-barchart-py

相關焦點

  • Python氣象繪圖教程(三)
    官網給出了很多符號樣式,可挑選你覺得好看的符號樣式即可(雖然我覺得沒幾個好看的):氣象上常用的有三線圖、五線圖。三線圖主要是日常氣象分析的氣壓、氣溫、溼度(或其他繪圖量)有時還會繪製降水柱狀圖。五線圖主要是展示春夏秋冬和年平均的變化關係。一張圖如果有更多的線條會使得界面凌亂不堪,不能用於科學分析。
  • python學習筆記:快速繪圖和3D柱狀圖
    快速繪圖#首先載入 matplotlib 的繪圖模塊 pyplot ,並且命名為 plt。figure12.簡單折線圖#導入繪圖所需要的包,首先導入了模塊 pyplot ,並給它指定了別名 plt ,以免反覆輸入 pyplotimport matplotlib.pyplot as pltinput_values
  • Python氣象繪圖教程(六)
    其中一部分來自氣象家園網站的現成帖子。A、使用savefig(''picture name'')保存圖像文件時,保存的圖片是空白的。解決辦法:第一種,將savefig命令移動至plt.show()命令之前。第二種,查看命令是否為fig.savefig(),一般來說,使用了figure,ax命令後,plt.savefig()需要更改為fig.savefig()。
  • 【圖解鴻蒙】使用繪圖組件Canvas繪製柱狀圖
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz一、運行效果在頁面中分別使用紅色、黃色和藍色顯示三組柱狀圖,如下圖所示:
  • 柱狀圖、堆疊柱狀圖、瀑布圖有什麼區別?怎樣用Python繪製?(附代碼)
    需要注意的是,分類太多不適合使用豎向柱狀圖,如圖2-34所示。分組柱狀圖,又叫聚合柱狀圖。當使用者需要在同一個軸上顯示各個分類下不同的分組時,需要用到分組柱狀圖。跟柱狀圖類似,使用柱子的高度來映射和對比數據值。每個分組中的柱子使用不同顏色或者相同顏色不同透明的方式區別各個分類,各個分組之間需要保持間隔。
  • Graphpad Prism 8.0繪製子列圖與柱狀圖
    Graphpad Prism 8.0是由Graphpad公司推出的一款非常實用的醫學繪圖軟體,集生物統計、
  • Python氣象繪圖教程(四)
    plt.figure()   ###準備畫布###                 ③讀取數據                 ④ax=fig.add_subplot()   ###添加作圖區###                 ⑤繪製圖形                 ⑥plt.show()   ###展示圖形###畫布figure及其參數、
  • 氣象繪圖加強版(六)—Colorbar
    而cax方式相當於有三個子圖,ax1,ax2與ax3,其中ax3用來存放色條。而只要更改添加子圖的位置參數,就可以在圖上隨意移動。這在多子圖上添加規範色條時非常方便。三、不等距的色條這是matplotlib官網上的一個例子,比較有意思,於是就搬過來了。基本上照原始碼修改就能用了。
  • 柱狀圖繪製,在R中兩行代碼就可以實現
    今天,小編給大家展示一下用R繪製柱狀圖是多麼簡單!首先,我們打開R軟體,在交互界面輸入N <- c(1,2,3,4,5,6) 點擊Enter,接著輸入r <- barplot(N, col = rainbow(20))。就繪製出最簡單的柱狀圖了。其中,第一行代碼中N是小編隨便寫的,可以理解為一個變量。
  • 專題第18篇:Python 繪圖入門
    18篇,同時也進入到一個新的階段:Python繪圖篇。作為繪圖模塊的第一篇,與大家一起過過最基本的Python繪圖原理。掌握基本的繪圖原理很有必要,各個常用繪圖庫的原理基本都是相通的。所以了解它們後,使用庫裡的API函數將會更加得心應手,並且熟練其中一個庫後,便能迅速上手其他的繪圖庫。
  • python學習筆記:同時畫多圖,折線圖,箱線圖,條形圖,柱狀圖等
    1.同時畫六張圖#從Matplotlib中導入了pyplot繪圖模塊from matplotlib.pyplot import *#設置相關的數值x=[1,2,3,4]y=[5,4,3,2]#創建一個圖紙
  • 如何用matplotlib繪圖呢?
    使用過python做數據分析的小夥伴都知道,matplotlib是一款命令式、較底層、可定製性強、圖表資源豐富、簡單易用、出版質量級別的python 2D繪圖庫。matplotlib算是python繪圖的元老級庫,類似程式語言裡的C語言。
  • Python微課 | Seaborn——Python優雅繪圖(上)
    Matplotlib:Python基礎繪圖包(本課中輔助繪圖)本節課內容與目的:通過官方文檔(Document)裡的現成示例學習Seaborn包,熟悉Seaborn繪圖背景的調節。在理解操作之前,我們先來看看數據結構是怎樣的:df.head(5)Out[9]:  dataset    x    y0      I  10.0  8.041      I   8.0  6.952      I  13.0  7.583      I   9.0  8.814      I  11.0  8.33可見數據有三,
  • 跟我快速學數據分析:Matplotlib繪圖(二)
    堆疊柱狀圖擴展了柱狀圖,將屬於同一類的數據逐個疊加起來,標以不同的顏色區分,既表示了每個分類的總量,又表示了該分類下的每個子分類的大小,直觀地顯示了總量和分量的數據
  • MATLAB氣象海洋簡單粗暴教程(三十三)——MATLAB裡畫圖的統計函數
    10*10格子的等間距立體柱狀圖。'Group'數據的分組信息'PlotGroup'分組繪圖指示,如果分組變量被指定,則默認是'on',反之是'off''Style'直方圖樣式。若有分組,默認是'stairs',繪製成階梯狀;如果沒有分組,則默認是'bar',繪製成柱狀圖。
  • Python-matplotlib 學術柱狀圖繪製
    黑灰顏色或者黑白陰影的柱狀圖或者條形圖,下面就具體介紹使用Python-matplotlib 的實現過程。matplotlib繪製這種柱狀圖或者條形圖還是比較簡單的,主要涉及的知識點就是ax.bar()方法的應用,首先進行黑灰顏色柱狀圖的繪製,具體代碼如下:plt.rcParams['font.family'] = ['Times New Roman']fig,ax = plt.subplots(1,1,figsize=(7,4.5),dpi=200
  • 凌波微課|微課雲系列教程之柱狀圖科研繪圖小工具
    在16S研究中,一般以堆疊柱狀圖來展示物種組成,不僅可以直觀的看到各樣本中的物種組成及比例,還可以看到樣本間物種的變化情況,是一類非常實用的圖表。微課雲小工具界面分為三個大的部分:最左側是菜單欄,中間是小工具參數設置界面,最右側是說明界面(包括使用說明、小工具教學視頻以及歷史任務記錄)。每個小工具我們都配套了相應的教學視頻,使用過程中可隨時查看學習。 1、上傳矩陣文件柱狀圖需要輸入的文件包含矩陣文件和分組文件,可使用excel表格編輯。
  • 手把手教你用GraphPad Prism完成分組柱狀圖
    同時,我們還將以最新發表、或各學科Top期刊文章中的結果圖為例,給大家逐一講解如何作圖(繪圖)!4. 選擇grouped下面的summary data,這裡我們選擇第一種形式進行展示,這時基本圖就出來了。
  • 未明學院:Python可視化庫Matplotlib繪圖入門詳解
    Matplotlib是Python的繪圖庫,其中的pyplot包封裝了很多畫圖的函數。Matplotlib.pyplot 包含一系列類似 MATLAB 中繪圖函數的相關函數。每個 Matplotlib.pyplot 中的函數會對當前的圖像進行一些修改,例如:產生新的圖像,在圖像中產生新的繪圖區域,在繪圖區域中畫線,給繪圖加上標記,等等…… Matplotlib.pyplot 會自動記住當前的圖像和繪圖區域,因此這些函數會直接作用在當前的圖像上。
  • 利用Python繪圖和可視化(長文慎入)
    matplotlib是一個用於創建出版質量圖表的桌面繪圖包(主要是2D方面)。該項目是由John Hunter於2002年啟動的,其目的是為Python構建一個MATLAB式的繪圖接口。如果結合使用一種GUI工具包(如IPython),matplotlib還具有諸如縮放和平移等交互功能。