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

PLC通信原理探秘大講堂幕后彩蛋之?dāng)R淺
相比Matplotlib 可視化神器Altair登場(chǎng)

用于數(shù)據(jù)科學(xué)的python必學(xué)模塊之Matplotlib的資料說(shuō)明

Python的Matplotlib函數(shù)匯總
如何利用Matplotlib用上漂亮的插圖
python中matplotlib和seaborn介紹

評(píng)論