matplotlib | Python強大的作圖工具,讓你從此駕馭圖表(二)

TechFlow2019發表於2020-09-17

今天是資料處理專題的第10篇文章,我們繼續來聊聊matplot這個工具庫。

在上週的文章當中我們介紹了matplot的基本用法,以及展示了一些簡單的例子,讓大家直觀地瞭解這個工具包。我們可以簡單地將它理解成專門用來作圖的工具,但是它作圖的功能又非常強大,以至於並不能當成一個簡單的內容來對待。道理也很簡單,老闆讓你去做一份資料出來,結果你畫出來的圖啥也沒有,也不知道什麼顏色代表什麼內容,也沒有標題,難以閱讀,顯然這是不行的。

所以我們還需要深入學習它的一些高階用法, 讓我們做出來的圖更加的直觀,展示更多的資訊,也更加美觀。

Figure設定影像大小

首先我們來介紹一個很重要的概念,叫做Figure。Figure是matplotlib的核心物件,可以理解成所有我們畫出來的影像的資料都存在figure物件當中。其實這個概念非常直觀,因為在英文當中figure本身就有影像的意思,當然它還可以指一個人的身材,扯遠了……

在計算機領域當中類似的概念有不少,如果我們不知道它的英文意思,可能會覺得這些概念都很費解,這邊一個概念,那邊一個概念,有時候如果能夠了解一下它對應的英文原意,也許會發現些驚喜,讓你理解更加順暢。

figure最簡單的用法就是設定matplotlib繪製出來圖片的大小,我們用sigmoid函式影像舉例,我們正常畫出來的影像是這樣的:

由於圖片會有縮放,所以大家可能很難直接從文章的圖片上看出它的大小,但是至少我們是可以看出來這是一個長方形的影像。如果我們想要將它繪製成正方形呢?或者是我們想要控制它的大小,讓它畫得長一些或者是寬一些或者是單純地大一些呢?

這時候我們就需要用到figure了,我們可以在figure當中通過figsize這個引數來設定它的大小。比如我們用下面這些程式碼繪製出來的影像就變了:

即使看不出來大小,但是我們也可以看得出來圖片變成了正方形。原因是因為我們傳入的size是一個(5, 5)的tuple,這裡的5的單位是英寸。也就是說我們通過引數設定,可以使得繪製出來的影像按照我們想要的大小展示,並且可以保證不論在什麼裝置上看到的結果都是一樣的。

subplot與子圖

有的時候我們希望把一系列圖表合併在一起,拼成一張大圖,這樣的話會更加方便我們觀看,可以一次性獲取更多的資訊。對於這個問題有好幾個解決方案,我們一個一個來看。

plt.subplot

首先,我們可以使用plt.subplot方法,subplot顧名思義就是子圖的意思。這時候我們傳入三個數,前面兩個參數列示我們最後想要得到的大圖的情況。比如說我們希望最後的大圖是由兩行一列的小圖組成的,那麼我們就傳入2,1。第三個參數列示當前繪製的是第幾個小圖。

這裡隱藏的重點是我們繪製多個子圖的時候是一個一個繪製的,小圖的擺放形式非常類似於二維陣列。我們來看一個例子:

plt.subplot(211)
plt.plot(range(10))
plt.subplot(212)
plt.plot(x, y)
plt.show()

可以看到我們一共呼叫了兩次plot方法,每一次呼叫之前都先呼叫了subplot申明瞭當前plot的是第幾個子圖。這樣我們得到的結果就是由兩行一列不同影像組成的大圖。

關於subplot有一點需要注意,如果我們在呼叫subplot之前也呼叫了plot,那麼我們plot的內容會被清除。比如說我們在subplot之前再多呼叫一次plot,得到的結果是一樣的。

plt.plot(10)
plt.subplot(211)
plt.plot(range(10))
plt.subplot(212)
plt.plot(x, y)

因為我們呼叫subplot的時候清除了當前figure當中已經有的內容,所以還是隻能看到上面的結果。

figure.add_subplot

上面一種方法的好處是用起來非常方便,我們只需要不停地呼叫subplot就可以了,但是壞處是會清除之前殘留的影像,還有就是不是非常直觀。雖然所有操作都通過plt進行非常方便,但是對於初學者而言要記住這麼多api並不是一件容易的事情。

所以這裡我們還有另外一種方法,這一種方法要直觀很多,也更加符合我們日常程式設計的習慣。這個方法就是通過figure呼叫add_subplot。也就是我們先建立figure物件之後,再往figure當中新增子圖。我們同樣來看個例子:

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)

ax1.plot(range(10))
ax2.plot(x, y)
plt.show()

在這段程式碼當中我們先建立了一個figure物件,然後再通過這個figure物件建立了兩個subplot物件。最後我們對於每一個subplot物件單獨繪製,這樣整個過程更加得順滑,和我們理解的物件導向的思想更加接近。還有一點就是它會保留建立子圖之前的改動。

如果我們在這段程式碼之前加上plt.plot(range(10))的話,那我們看到的結果會是這樣的:

subplots

最後一種方法是subplots,它是第二種方法的進化。我們在使用第二種方法的時候有沒有一種覺得很麻煩的感覺?因為我們要先建立figure,再通過figure建立subplot。我們最後操作的物件是subplot,既然如此,為什麼我們不能直接建立出subplot物件來呢?

所以plt當中提供了subplots方法可以直接建立出figure和subplot物件,我們只需要傳入我們希望得到的子圖的長和寬即可。由於子圖會有多個,所以返回的結果會自動存入一個二維陣列當中,我們只需要用陣列的形式去訪問它即可。

我們來看一個例子:

關於figure和subplot的基本用法就介紹完了,當然除了今天介紹的內容之外,還有很多其他的用法,這些就留到之後的文章介紹吧。

今天的文章到這裡就結束了,如果喜歡本文的話,請來一波素質三連,給我一點支援吧(關注、轉發、點贊)。

原文連結,求個關注

- END -

相關文章