天天看點

Matplotlib基礎全攻略

本文來自雲栖社群官方釘群“ Python技術進階 ”,了解相關資訊可以關注“ ”。

Matplotlib是Python中最流行的繪圖庫,它模仿MATLAB中的繪圖風格,提供了一整套與MATLAB相似的繪圖API,通過API,我們可以輕松地繪制出高品質的圖形。

1、開場例子

我們以中國銀行股票收盤價曲線作為例子來作為開場。

首先我們通過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年中國銀行股票收盤價的走勢圖:

plt.plot(Close['2014'])
plt.show()
           
Matplotlib基礎全攻略

是不是很簡單,接下來,我們一起去慢慢探秘Matplotlib的強大之處

2、修改繪圖屬性

2.1 坐标

更改坐标範圍

繪圖時往往需要修改橫縱坐标軸的範圍,以使曲線位于圖形的中間位置:

plt.plot([1,1,0,0,-1,0,1,1,-1])
plt.show()
           
Matplotlib基礎全攻略

我們可以通過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()
           
Matplotlib基礎全攻略

設定坐标軸标簽和旋轉

我們可以通過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()
           
Matplotlib基礎全攻略

可以看到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()
           
Matplotlib基礎全攻略

可以看到,在mac的Ipython環境下,中文是無法正常顯示的,我們可以通過下面的方法解決:

from matplotlib.font_manager import FontManager, FontProperties
def getChineseFont():  
    return FontProperties(fname='/System/Library/Fonts/PingFang.ttc')  
    
plt.plot(Close['2014'])
plt.title('中國銀行2014年收盤價曲線',loc='right',fontproperties=getChineseFont())
plt.show()
           
Matplotlib基礎全攻略

設定坐标軸标簽

設定坐标軸标簽可以通過xlabel和ylabel函數來實作

plt.plot(Close['2014'])
plt.title('中國銀行2014年收盤價曲線',loc='center',fontproperties=getChineseFont())
plt.xlabel('日期',fontproperties=getChineseFont())
plt.ylabel('收盤價',fontproperties=getChineseFont())
plt.show()
           
Matplotlib基礎全攻略

增加圖形背景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()
           
Matplotlib基礎全攻略

增加圖例

當多條曲線顯示在同一張圖中時,圖例可以幫助我們區分識别不同的曲線,在中國銀行的資料中,我們可以把開盤價和收盤價同時放在一張曲線圖中,并為二者增加圖例.

增加圖例使用legend()函數,legend函數中最常見的一個參數是loc參數,表示圖例在圖中顯示的位置,我們一般設定為best就好,表示在圖中最适宜的位置顯示圖例成功增加圖例的前提是在繪圖時提供label屬性值,label屬性值就是圖例上的文本,同時我們還要注意中文顯示的問題。

Open=ChinaBank.Open
plt.plot(Close['2014'],label='收盤價')
plt.plot(Open['2014'],label='開盤價')
plt.legend(loc='best',prop=getChineseFont())
plt.show()
           
Matplotlib基礎全攻略

2.3 多種線條屬性

線條的類型

在繪制曲線時,除了繪制實線外,還可以繪制虛線,plot函數中的linestyle參數用于設定曲線類型,為了書寫友善,有時候用ls代替linestyle。有如下的常見取值

Matplotlib基礎全攻略
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()
           
Matplotlib基礎全攻略

圖形的顔色

修改圖形的顔色通過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()
           
Matplotlib基礎全攻略

點的形狀類型

除了設定線條類型外,還可以設定資料點的形狀,圖形的形狀通過marker參數來設定.marker參數主要有下面的取值:

Matplotlib基礎全攻略
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()
           
Matplotlib基礎全攻略

線條寬度

線條寬度可以通過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()
           
Matplotlib基礎全攻略

前面講到的線條的類型,圖形的顔色和點的形狀類型,可以合為一個屬性,使用他們的符号取值将其拼接,這個參數的位置是有限制的,比如在下面的代碼中,它隻能放在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()
           
Matplotlib基礎全攻略

3、常見圖形繪制

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')
           
Matplotlib基礎全攻略

使用barh函數可以繪制水準柱狀圖:

plt.barh([2,3,4,5],[228,35,81,1],height=1.0,color='r',edgecolor='b')
           
Matplotlib基礎全攻略

3.2 直方圖

柱狀圖主要用于展示定性資料的分布,對于定量資料的分布,一般使用直方圖來呈現。繪制直方圖用pyplot包中的hist函數來實作,主要有以下幾個參數:

bins用于設定直方圖分布區間的個數;

range用于設定直方圖的小矩形的最小值與最大值;

orientation用于設定直方圖的水準或者垂直顯示,預設是豎直的直方圖,可以将orientation設定為horizontal使其變為水準直方圖.

plt.hist(Close,bins=12)
           
Matplotlib基礎全攻略
plt.hist(Close,bins=12,orientation='horizontal')
           
Matplotlib基礎全攻略

也可以繪制累積分布直方圖,将參數cumulative設定為True即可:

plt.hist(Close,range=(2.3,5.5),orientation='vertical',cumulative=True,color='r',edgecolor='b')
           
Matplotlib基礎全攻略

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)
           
Matplotlib基礎全攻略

3.4 箱線圖

箱線圖也是在分析資料時經常用到的一種圖形,正如其名,箱線圖由一個矩形和兩條線組成,矩形的上邊和下邊分别是變量的上下四分位數,中間的一條線表示數變量的中位數。在矩形的上下兩邊各延伸出一條線,每條線的長度一般為1.5倍的四分位距(上下四分位數之差),這兩條線被視為異常值截斷線,上端的線為上邊緣線,下端的線為下邊緣線,線上的外面可能還會有一些點,這些點一般會被認為是異常值。箱線圖能夠很直覺地表示出一個變量的分布,也有助于檢測異常值。

pyplot的boxplot函數用于繪制箱線圖,主要有以下幾個參數:

notch:表示箱線圖的類型,預設為False,即繪制矩形箱線圖,如果取值為True,表示繪制鋸齒狀箱線圖

labels:表示箱形圖的标簽,一般為字元串序列類型

import numpy as np
prcData = ChinaBank.iloc[:,:4]
data = np.array(prcData)
plt.boxplot(data,labels=('Open','High','Low','Close'))
plt.title('中國銀行股票箱線圖',fontproperties=getChineseFont())
           
Matplotlib基礎全攻略

4、多圖繪制

除了上面介紹的,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()
           
Matplotlib基礎全攻略

在實際繪圖中,如果一個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()
           
Matplotlib基礎全攻略

參數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<Open15]
hight2 = Volume15[left2]
ax2.bar(left2,hight2,color='g')

ax2.set_ylabel('成交量')
ax2.set_title('中國銀行2015年成交量柱狀圖')

plt.show()
           
Matplotlib基礎全攻略

原文釋出時間為:2018-07-30

本文作者:石曉文

Python技術進階交流群

Matplotlib基礎全攻略