Matplotlib是Python中最流行的繪圖庫,它模仿MATLAB中的繪圖風格,提供了一整套與MATLAB相似的繪圖API,通過API,我們可以輕松地繪制出高質量的圖形。
開場例子
我們以中國銀行股票收盤價曲線作為例子來作為開場。首先我們通過pandas導入數據,并提取出收盤價一列:
ChinaBank=pd.read_csv('data/ChinaBank.csv',index_col='Date')ChinaBank=ChinaBank.iloc[:,1:]ChinaBank.index=pd.to_datetime(ChinaBank.index)Close=ChinaBank.Close
我們來繪制2014年中國銀行股票收盤價的走勢圖:
.plot(Close['2014'])plt.show()
是不是很簡單,接下來,我們一起去慢慢探秘Matplotlib的強大之處
修改繪圖屬性
2.1 坐標
更改坐標范圍繪圖時往往需要修改橫縱坐標軸的范圍,以使曲線位于圖形的中間位置:
plt.plot([1,1,0,0,-1,0,1,1,-1])plt.show()
我們可以通過ylim方法修改y軸的范圍,比如我們想修改為(-1.5,1.5),同理,我們可以通過xlim方法來修改x軸的坐標范圍:
plt.plot([1,1,0,0,-1,0,1,1,-1])plt.ylim(-1.5,1.5)plt.show()
設定坐標軸標簽和旋轉我們可以通過xticks()和yticks()函數設定坐標的標簽,兩個函數主要有以下兩個參數:location:指坐標的位置.
labels:對應的坐標位置顯示的標簽.
兩個參數一般是等長的數組,該函數另一個常用的參數是rotation參數,可以對坐標標簽進行適當的旋轉,看下面的例子:
plt.plot([1,1,0,0,-1,0,1,1,-1])plt.ylim(-1.5,1.5)plt.xticks(range(9),['02-01','02-02','02-03','02-04','02-05','02-06','02-07','02-08','02-09'],rotation=45)plt.show()
可以看到X坐標由原來的數值1,2,3變成了我們設置的日期,同時標簽與X軸成45度角.
2.2 添加文本
添加標題添加標題可以通過title函數來實現,該函數主要有兩個參數,第一個是str,指明標題的內容,第二個是loc,指明標題的位置,可以選擇center,left或者right,默認是center
plt.plot(Close['2014'])plt.title('中國銀行2014年收盤價曲線',loc='right')plt.show()
可以看到,在mac的Ipython環境下,中文是無法正常顯示的,我們可以通過下面的方法解決:
frommatplotlib.font_managerimportFontManager,FontPropertiesdefgetChineseFont():returnFontProperties(fname='/System/Library/Fonts/PingFang.ttc')plt.plot(Close['2014'])plt.title('中國銀行2014年收盤價曲線',loc='right',fontproperties=getChineseFont())plt.show()
設置坐標軸標簽設置坐標軸標簽可以通過xlabel和ylabel函數來實現
plt.plot(Close['2014'])plt.title('中國銀行2014年收盤價曲線',loc='center',fontproperties=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盤價',fontproperties=getChineseFont())plt.show()
增加圖形背景grid繪圖時常常會在圖形背景中增添方格,以便于人們更直觀地讀取線條中點的坐標取值以及線條整體的分布范圍.可以使用grid函數增加和設定圖形的背景.
函數原型:matplotlib.pyplot.grid(b=None,which='major',axis='both',**kwargs)
參數b,設定是否顯示grid,如果要顯示grid,將b參數設置為True、參數which,設定坐標軸的分割標示線的類型,取值為major、minor或者both,默認為major,表示以原本的坐標軸分割標示線為準;若取值為minor,則進一步細分坐標軸分割標示線,但是分割標準要提前設定,如果只是設定值為minor,則grid不會顯示;both表示大小區間坐標軸分割線都有參數axis,指定繪制grid 的坐標軸,取值為both,x或y。
plt.plot(Close['2014'])plt.title('中國銀行2014年收盤價曲線',loc='center',fontproperties=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盤價',fontproperties=getChineseFont())plt.grid(True,axis='y')plt.show()
增加圖例當多條曲線顯示在同一張圖中時,圖例可以幫助我們區分識別不同的曲線,在中國銀行的數據中,我們可以把開盤價和收盤價同時放在一張曲線圖中,并為二者增加圖例.
增加圖例使用legend()函數,legend函數中最常見的一個參數是loc參數,表示圖例在圖中顯示的位置,我們一般設置為best就好,表示在圖中最適宜的位置顯示圖例成功增加圖例的前提是在繪圖時提供label屬性值,label屬性值就是圖例上的文本,同時我們還要注意中文顯示的問題。
Open=ChinaBank.Openplt.plot(Close['2014'],label='收盤價')plt.plot(Open['2014'],label='開盤價')plt.legend(loc='best',prop=getChineseFont())plt.show()
2.3 多種線條屬性
線條的類型在繪制曲線時,除了繪制實線外,還可以繪制虛線,plot函數中的linestyle參數用于設置曲線類型,為了書寫方便,有時候用ls代替linestyle。有如下的常見取值:
類型 | 名稱取值 | 符號取值 |
---|---|---|
實線 | 'solid' | '-' |
虛線 | 'dashed' | '--' |
線點 | 'dashdot' | '-.' |
點線 | 'dotted' | ':' |
不畫線 | 'None' | ' ' |
plt.plot(Close['2014'],label='收盤價',linestyle='solid')plt.plot(Open['2014'],label='開盤價',ls='-.')plt.legend(loc='best',prop=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盤價',fontproperties=getChineseFont())plt.title('中國銀行2014年收盤價曲線',loc='center',fontproperties=getChineseFont())plt.grid(True,axis='y')plt.show()
圖形的顏色修改圖形的顏色通過plot函數中的color參數來設置,也可以簡寫成c,最常用的顏色指定方式是指定顏色的名稱或者簡寫,也可以通過RGB數組來設置.
plt.plot(Close['2014'],label='收盤價',c='r',linestyle='solid')plt.plot(Open['2014'],label='開盤價',c='b',ls=':')plt.legend(loc='best',prop=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盤價',fontproperties=getChineseFont())plt.title('中國銀行2014年收盤價曲線',loc='center',fontproperties=getChineseFont())plt.grid(True,axis='y')plt.show()
點的形狀類型除了設置線條類型外,還可以設置數據點的形狀,圖形的形狀通過marker參數來設置.marker參數主要有下面的取值:
類型 | 名稱取值 | 符號取值 | |
---|---|---|---|
點 | 'point' | '.' | |
圓圈 | 'circle' | 'o' | |
向下三角形 | 'triangle_down' | 'v' | |
向上三角形 | 'triangle_up' | '^' | |
向左三角形 | 'triangle_left' | ' <' | |
向右三角形 | 'triangle_right' | '>' | |
正方形 | 'square' | 's' | |
五邊形 | 'pentagon' | 'p' | |
六邊形 | 'hexagonal' | 'h' | |
加號 | 'plus' | '+' | |
叉號 | 'x' | 'x' | |
鉆石 | 'diamond' | 'D' | |
星號 | 'star' | '*' | |
豎線 | 'line' | ' | ' |
plt.plot(Close['2014'],label='收盤價',c='r',marker='o',linestyle='solid')plt.plot(Open['2014'],label='開盤價',c='b',marker='v',ls='-.')plt.legend(loc='best',prop=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盤價',fontproperties=getChineseFont())plt.title('中國銀行2014年收盤價曲線',loc='center',fontproperties=getChineseFont())plt.grid(True,axis='y')plt.show()
線條寬度線條寬度可以通過plot函數中的linewidth函數指定,也可簡寫為lw
plt.plot(Close['2014'],label='收盤價',c='r',marker='o',linestyle='solid',linewidth=1)plt.plot(Open['2014'],label='開盤價',c='b',marker='>',ls='-.',lw=3)plt.legend(loc='best',prop=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盤價',fontproperties=getChineseFont())plt.title('中國銀行2014年收盤價曲線',loc='center',fontproperties=getChineseFont())plt.grid(True,axis='y')plt.show()
前面講到的線條的類型,圖形的顏色和點的形狀類型,可以合為一個屬性,使用他們的符號取值將其拼接,這個參數的位置是有限制的,比如在下面的代碼中,它只能放在label前面,在label參數后面則會報錯.
plt.plot(Close['2014'],'--rD',label='收盤價',linewidth=1)plt.plot(Open['2014'],'--b>',label='開盤價',lw=3)plt.legend(loc='best',prop=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盤價',fontproperties=getChineseFont())plt.title('中國銀行2014年收盤價曲線',loc='center',fontproperties=getChineseFont())plt.grid(True,axis='y')plt.show()
常見圖形繪制
3.1 柱狀圖
在剛才的收盤價數據中,統計收盤價落在(2,3],(3,4],(4,5],(5,6]的天數,分別有228,35,81,1天,我們來繪制柱狀圖:
plt.bar(left=[2,3,4,5],height=[228,35,81,1],bottom=2,width=1,color='r',edgecolor='b')
使用barh函數可以繪制水平柱狀圖:
plt.bar(left=[2,3,4,5],height=[228,35,81,1],bottom=2,width=1,color='r',edgecolor='b')
3.2 直方圖
柱狀圖主要用于展示定性數據的分布,對于定量數據的分布,一般使用直方圖來呈現。繪制直方圖用pyplot包中的hist函數來實現,主要有以下幾個參數:bins用于設置直方圖分布區間的個數;range用于設置直方圖的小矩形的最小值與最大值;orientation用于設置直方圖的水平或者垂直顯示,默認是豎直的直方圖,可以將orientation設置為horizontal使其變為水平直方圖.
plt.hist(Close,bins=12)
plt.hist(Close,bins=12,orientation='horizontal')
也可以繪制累積分布直方圖,將參數cumulative設置為True即可:
plt.hist(Close,range=(2.3,5.5),orientation='vertical',cumulative=True,color='r',edgecolor='b')
3.3 餅圖
繪制餅圖使用pie方法,主要參數有:labels:用于設置扇形圖的標簽colors:用于設置扇形圖的顏色shadow:用于設定扇形圖是否有陰影
plt.pie([228,35,81,1],labels=('(2,3]','(3,4]','(4,5]','(5,6]'),colors=('b','g','r','c'),shadow=True)
3.4 箱線圖
箱線圖也是在分析數據時經常用到的一種圖形,正如其名,箱線圖由一個矩形和兩條線組成,矩形的上邊和下邊分別是變量的上下四分位數,中間的一條線表示數變量的中位數。在矩形的上下兩邊各延伸出一條線,每條線的長度一般為1.5倍的四分位距(上下四分位數之差),這兩條線被視為異常值截斷線,上端的線為上邊緣線,下端的線為下邊緣線,在線的外面可能還會有一些點,這些點一般會被認為是異常值。箱線圖能夠很直觀地表示出一個變量的分布,也有助于檢測異常值。
pyplot的boxplot函數用于繪制箱線圖,主要有以下幾個參數:notch:表示箱線圖的類型,默認為False,即繪制矩形箱線圖,如果取值為True,表示繪制鋸齒狀箱線圖labels:表示箱形圖的標簽,一般為字符串序列類型
importnumpyasnpprcData=ChinaBank.iloc[:,:4]data=np.array(prcData)plt.boxplot(data,labels=('Open','High','Low','Close'))plt.title('中國銀行股票箱線圖',fontproperties=getChineseFont())
多圖繪制
除了上面介紹的,Matplotlib的另一大特色是面向對象的繪圖,類比生活中的用紙筆繪圖,我們來解釋Matplotlib面向對象繪圖在使用生活中紙筆畫圖時,我們需要先找到一張白紙,在白紙上繪圖。對于Matplotlib來說,繪圖之前需要先創建一個Figure對象,Figure對象是一個空白區域,然后我們就可以在上面進行繪圖。Figure對象可通過pyplot包中的figure函數來創建。
fig=plt.figure(1)
在這張白紙上,我們可以選擇較大區域,指畫一個收盤價折線圖,如果想要節約用紙或者對比兩個價格序列,可以將這個紙分成兩個區域,分別繪制收盤價折線圖和開盤價折線圖。在Matplotlib繪圖中,每個Figure對象可以包含一個或者幾個Axes對象.每個Axes對象即一個繪圖區域,擁有自己獨立的坐標系統,假設我們現在需要兩個區域,分別繪制中國銀行股票的開盤價走勢和收盤價走勢,我們可以創建兩個Axes對象.
ax1=fig.add_axes([0.1,0.1,0.3,0.3])ax2=fig.add_axes([0.5,0.5,0.4,0.4])
可以看到在創建Axes對象時傳入了一個數值型list,list的前兩個元素決定了Axes的左下角坐標,而第三個和第四個參數決定了Axes的長和寬接下來,我們基本就可以按照之前介紹的知識進行繪圖了:
fig=plt.figure(1)ax1=fig.add_axes([0.1,0.1,0.3,0.3])ax2=fig.add_axes([0.5,0.5,0.4,0.4])ax1.plot(Close[:10])ax1.set_title('前十個交易日收盤價',fontproperties=getChineseFont())ax1.set_xlabel('日期',fontproperties=getChineseFont())ax1.set_ylabel('收盤價',fontproperties=getChineseFont())ax1.set_ylim(2.4,2.65)ax2.plot(Open[:10])ax2.set_title('前十個交易日開盤價',fontproperties=getChineseFont())ax2.set_xlabel('日期',fontproperties=getChineseFont())ax2.set_ylabel('開盤價',fontproperties=getChineseFont())ax2.set_ylim(2.4,2.65)plt.show()
在實際繪圖中,如果一個Figure對象中包含多個Axes對象,每個Axes對象的位置除了通過區域坐標和長度來設定一位,更為常用的方式是通過子圖subplot()函數來設定。
fig=plt.figure()ax1=plt.subplot(221)ax2=plt.subplot(222)ax3=plt.subplot(223)ax4=plt.subplot(224)plt.show()
參數221中的22表示子圖排列為2*2形式,1表示第一個子圖,其他均為同樣的道理.最后,我們再來體驗一個繪制多圖的例子:
Close15=Close['2015']ax1=plt.subplot(221)ax1.plot(Close15,color='k')ax1.set_xlabel('日期',fontproperties=getChineseFont())ax1.set_ylabel('收盤價',fontproperties=getChineseFont())ax1.set_title('中國銀行2015年收盤價曲線',fontproperties=getChineseFont())Volume15=ChinaBank['Volume']['2015']Open15=Open['2015']ax2=plt.subplot(212)left1=Volume15.index[Close15>=Open15]hight1=Volume15[left1]ax2.bar(left1,hight1,color='r')left2=Volume15.index[Close15
-
matlab
+關注
關注
185文章
2977瀏覽量
230602 -
函數
+關注
關注
3文章
4333瀏覽量
62709 -
python
+關注
關注
56文章
4797瀏覽量
84776
原文標題:Matplotlib基礎全攻略
文章出處:【微信號:atleadai,微信公眾號:LeadAI OpenLab】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論