淺談matplotlib.pyplot與axes的關係
最近在學習資料視覺化,梳理一下其中一些諸如pandas繪圖、matplotlib繪圖、pyplot(plt)、axes等概念。
重要的事情說三遍:axes不是axis!axes不是axis!axes不是axis!
重要的事情說三遍:pyplot是介面不是物件!pyplot是介面不是物件!pyplot是介面不是物件!
很多書上一上來就直接import matplotlib.pypltot as plt
,然後就教你plt.xxx()
。這種方式固然沒錯,可問題就出在了plt
只是一個interface,只是一個介面,連物件都算不上(仔細回想,你確實沒有例項化過任何一個名叫plt
型別的物件)這給本來就對面向物件程式設計並不很熟悉的我帶來無窮無盡的困擾
plt
這個介面的意義在於:
- 通過介面直接畫圖(這時候我們把這個介面看成一個黑盒,根本不要去管其中有些什麼物件型別)
- 通過介面例項化別的型別的物件(如
figure
型別axes
型別等)
1.通過plt.xxx()直接繪圖
就像各種教程和書上的常規操作一樣,我們可以用plt.plot(),plt.bar()等繪製不同型別的圖(部分總結如下表)
表一 plt中用於繪圖的部分函式
函式名 | 作用 |
---|---|
plt.bar() | 條形圖 |
plt.barh() | 橫排條形圖 |
plt.boxplot() | 箱線圖(plt.box()是另一個函式) |
plt.hist() | 頻率直方圖 |
plt.plot() | 折線圖 |
我們可以用plt
的其他一些函式來對圖表的標題等進行設定(部分總結如下表)
表二 plt中用於設定的部分函式
函式名 | 作用 |
---|---|
plt.title() | 設定圖表標題 |
plt.grid() | 設定圖表網格 |
plt.xlabel();plt.ylabel | 設定x;y軸標題 |
plt.xticks();plt.yticks() | 設定x;y軸刻度 |
plt.xlim();plt.ylim() | 設定x;y軸範圍 |
plt.annotate() | 設定標註 |
(具體的引數和用法詳見 https://matplotlib.org/api/pyplot_summary.html )
用plt繪圖的方便之處,同樣也是它最令人迷惑的地方,就是它沒有一個顯性的物件。
我們甚至可以呼叫pandas繪圖以後,用表二中的plt函式來對pandas生成的這個圖表進行設定。
例程如下:
import matplotlib.pyplot as plt from pandas import Series data = Series([1.47,1.62,1.78,1.94,2.38,2.60],index=['2012','2013','2014','2015','2016','2017']) #注意下一行的物件是'data',它是一個series物件,呼叫的是pandas繪圖函式 data.plot(label='income',color = 'r',linestyle=':',marker = 's')#具體的pandas繪圖之後會細講 #但接下來我們甚至可以呼叫plt的函式對它進行設定 plt.title('Income chart') plt.xlabel('Year') plt.ylabel('income') plt.annotate('Largest point',xy=(5,2.60),xytext=(3,2.5),arrowprops=dict(arrowstyle='->')) plt.show()
上面這個例子就展示了pyplot
(plt
)的特點,不用指明物件就能進行畫圖和設定,當我們在同一個程式中的圖比較少的時候這是方便的,但當我們同一個程式中的圖很多的時候,這種沒有顯性物件的方式會導致我們沒有辦法重新呼叫之前的圖(因為沒有物件名)也會給人一種很不踏實的感覺。
2.例項化figure和axes物件後繪圖
就像前文提到的,plt
只是一個介面而不是物件。
在matplotlib中,有兩個重要的物件型別:figure
物件可以把它想成一張空白圖紙,在上面可以繪製一個或多個axes
物件(還可以有其他物件等)。axes
物件是一個影象的主要部分(它包括了圖線、xy軸等部分)。
我們可以使用plt
介面生成figure
物件和axes
物件,然後對axes
物件呼叫方法來實現畫圖和設定。
總體思路是:
- 例項化figure物件
- 例項化axes物件
- 對axes物件呼叫方法進行畫圖和設定
例程如下:
import matplotlib.pyplot as plt from pandas import Series data = Series([1.47,'2017']) #呼叫plt介面,例項化figure1物件 figure1 = plt.figure(facecolor='w')#faceclolr設定背景顏色 #例項化ax1物件 ax1 = figure1.add_subplot(111)#ax1是figure1的第1行第一列的第1張圖表 #注意下一行的物件是'ax1',它是一個axes物件,呼叫的是matplotlib.axes繪圖函式 ax1.plot(data,label='income',marker = 's') #接下來我們呼叫ax1的方法對它進行設定 ax1.set_title('Income chart') ax1.set_xlabel('Year') ax1.set_ylabel('income') ax1.annotate('Largest point',arrowprops=dict(arrowstyle='->'))
用這種方式畫出來的圖,每一個物件都有它自己的名字,方便後面繼續呼叫、修改。程式碼也就多了兩行例項化的過程,並沒有麻煩很多,個人很喜歡用這種方式畫圖(也給人一種很踏實的感覺)。
類比上面的表一和表二,給出對於axes物件的方法函式表:
表三 axes物件用於繪圖的部分方法函式
函式名 | 作用 |
---|---|
ax.bar() | 條形圖 |
ax.barh() | 橫排條形圖 |
ax.boxplot() | 箱線圖 |
ax.hist() | 頻率直方圖 |
ax.plot() | 折線圖 |
表四 axes物件中用於設定的部分方法函式
函式名 | 作用 |
---|---|
ax.set_title() | 設定圖表標題 |
ax.set_xlabel(); ax.set_ylabel | 設定x;y軸標題 |
ax.set_xticks(); ax.set_yticks() | 設定x;y軸刻度 |
ax.set_xlim(); ax.set_ylim() | 設定x;y軸範圍 |
ax.annotate() | 設定標註 |
(具體的引數和用法詳見 https://matplotlib.org/api/axes_api.html )
注意表一和表三,表二和表四的異同:
- 表一表二中的
plt
是固定的名字,不論畫什麼都是plt.xxx()
,而表三和表四中ax.xxx()
中的ax
要改成你例項的物件名。 - 注意對比表二和表四,很多作用相同的東西,跑到了axes這裡要多加一個
set_
用例項化axes的方式畫圖很重要,因為多子圖的繪製更是需要依賴axes物件。
我還會分兩期分別介紹一下axes與多子圖的繪製和axes與pandas繪圖的關係。
到此這篇關於淺談matplotlib.pyplot與axes的關係的文章就介紹到這了,更多相關matplotlib.pyplot axes內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!