天天看點

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

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

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

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

Figure設定圖像大小

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

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

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

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

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

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

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

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

subplot與子圖

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

plt.subplot

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

這裡隐藏的重點是我們繪制多個子圖的時候是一個一個繪制的,小圖的擺放形式非常類似于二維數組。我們來看一個例子:

plt.subplot(2, 1, 1)
plt.plot(range(10))
plt.subplot(2, 1, 2)
plt.plot(x, y)
plt.show()
           

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

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

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

plt.plot(10)
plt.subplot(2, 1, 1)
plt.plot(range(10))
plt.subplot(2, 1, 2)
plt.plot(x, y)
           

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

figure.add_subplot

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

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

fig = plt.figure()
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)

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

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

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

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

subplots

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

是以plt當中提供了subplots方法可以直接建立出figure和subplot對象,我們隻需要傳入我們希望得到的子圖的長和寬即可。由于子圖會有多個,是以傳回的結果會自動存入一個二維數組當中,我們隻需要用數組的形式去通路它即可。

我們來看一個例子:

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

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

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

原文連結,求個關注

- END -

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

繼續閱讀