天天看點

python axes_淺談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()

設定标注

用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()

python axes_淺談matplotlib.pyplot與axes的關系

上面這個例子就展示了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,1.62,1.78,1.94,2.38,2.60],index=['2012','2013','2014','2015','2016','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', color = 'r', linestyle=':', marker = 's')

#接下來我們調用ax1的方法對它進行設定

ax1.set_title('Income chart')

ax1.set_xlabel('Year')

ax1.set_ylabel('income')

ax1.annotate('Largest point',xy=(5,2.60),xytext=(3,2.5), arrowprops=dict(arrowstyle='->'))

python axes_淺談matplotlib.pyplot與axes的關系

用這種方式畫出來的圖,每一個對象都有它自己的名字,友善後面繼續調用、修改。代碼也就多了兩行執行個體化的過程,并沒有麻煩很多,個人很喜歡用這種方式畫圖(也給人一種很踏實的感覺)。

類比上面的表一和表二,給出對于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()

設定标注

注意表一和表三,表二和表四的異同:

表一表二中的plt是固定的名字,不論畫什麼都是plt.xxx(),而表三和表四中ax.xxx()中的ax要改成你執行個體的對象名。

注意對比表二和表四,很多作用相同的東西,跑到了axes這裡要多加一個set_

用執行個體化axes的方式畫圖很重要,因為多子圖的繪制更是需要依賴axes對象。

我還會分兩期分别介紹一下axes與多子圖的繪制和axes與pandas繪圖的關系。

到此這篇關于淺談matplotlib.pyplot與axes的關系的文章就介紹到這了,更多相關matplotlib.pyplot axes内容請搜尋python部落格以前的文章或繼續浏覽下面的相關文章希望大家以後多多支援python部落格!