阿掖山
阿掖山

智力活动是一种生活态度 https://mountaye.github.io/blog/

.py | matplotlib筆記:兩種API

“圖”這個字在英語中可以對應好幾個詞,picture, image, figure, plot… 其中的plot,意思是展示兩組或兩組以上的數據之間關係的圖像。用時髦一點的話說,就是數據可視化的產物。所謂matplotlib ,顧名思義, mat表示山寨MATLAB, plot的含義如上所述, lib表示這是python 的一個第三方庫(library),而不是某種領域專用的編程語言(domain specific languange, DSL)

所謂API,全稱是application programming interface, 應用程序接口,約等於在你有了自己的數據,想調用matplotlib 來畫圖的時候,那些需要寫在你自己代碼裡的語句的語法規則。

因為是代碼庫,所以在一切開始之前,需要在你的python 代碼開頭聲明引入

import matplotlib.pyplot as plt

plt可以換成你喜歡並且不和其他代碼衝突的名字,但是這三個字母是大家的約定俗成的,網上的絕大多數示例代碼都這麼寫,照抄就完事了。

matplotlib的兩種API

matplotlib有兩種API,(其實還有第3 種pylab ,但它沒能經得起時間的檢驗,已經處於官方極不推薦的狀態),分別是:

  • 基於狀態的(state-based)
  • 面向對象的(object-oriented)

兩種風格混用的話大概率沒法玩得轉,會產生各種出人意料的輸出結果,新手debug 的能力又比較差,所以最好先選邊站隊,有時間再學剩下的一個。

對於有MATLAB 基礎的朋友,基於狀態的API 語法和MATLAB 幾乎一模一樣,幾乎可以直接上手,當年python 算是後起之秀,這一招當初就是為了從MATLAB 那裡吸引用戶, 相當歹毒。這套接口本身也比較簡單,適合在調試程序的時候快速看一下結果,檢查錯誤。

對於一般的初學者,matplotlib 的代碼本身就是用面向對象的編程範式寫成的,學習這套API 可以更好的理解代碼,知道自己究竟在幹什麼,順便還可以熟悉一下面向對象的編程範式。現在學python 之前就會MATLAB 的人越來越少,網上 可供複製粘貼 的示例代碼越來越多地使用面向對象的語法,學習面向對象的接口也更加實用。

兩種API 的相同任務

上圖來自網上隨便找的一篇論文,可以看到,一般我們會把信息相關的幾幅小圖放在一起,在文章排版的時候,這張組合在一起的圖片算作一個單位。在matplotlib 裡面,這樣一個基本單位叫做figure ,而每一幅小圖叫做axis (變量名常簡寫作ax )。平時的單圖可以看作只有一個axisfigure ,多圖的時候往往用一個tuple axes__getitem__()方法來控制每個子圖。

上圖來自官網,圖中的藍字就是matplotlib 認為的一張只有一個axis 的figure 所包含的元素。

兩種API 要做的事情,就是建立figureaxis ,然後提供函數/方法來生成或者改變各個元素。

基於狀態(state-based)

所謂基於狀態的API,不太好解釋,前面已經說過,在每個函數前面加上plt,剩下的就和寫MATLAB 幾乎完全一樣。

官網給出的教程,可以觀察到兩個有趣的現象:

  • 幾乎沒有賦值運算符=
  • 幾乎所有的.前面都是plt

也就是說,與matplotlib 相關的命令都是函數,而且不需要將返回值賦給任何變量。 figureaxis的概念被隱藏起來了, plt.figure()建立一個figure; plt.subplot()建立多個axes,並且將程序的注意力放到函數參數指定的子圖上;緊跟著的設定各種元素的函數都會作用到之前最新一個plt.subplot()所指定的子圖上。

沒有賦值說明函數的返回值並不重要,這些函數都會作用在後台維護的figure 和axis 的狀態機上面,也就是說這些函數都有副作用,不是純函數。

面向對象(object-oriented)

作為對比

  • 頭幾句會有賦值運算符= ,被賦值的變量名一般就是figax
  • .前面都是figax ,其中ax居多。

figax分別是matplotlib.figure.Figurematplotlib.axes.Axes兩種對象的實例,畫圖和調整都是在調用兩種對象的方法,主要是ax的方法。

不同之處Cheat Sheet

絕大多數命令,在兩種API 之下的名字都一樣,差別就在於開頭究竟是plt.還是ax. ,但是少數命令不同,下面做了一個表格,進行一個不完全的列舉:


其他不同的命令,以後用到的時候會隨手更新。

CC BY-NC-ND 2.0 版權聲明

喜歡我的文章嗎?
別忘了給點支持與讚賞,讓我知道創作的路上有你陪伴。

載入中…
載入中…

發布評論