智力活动是一种生活态度 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
)。平時的單圖可以看作只有一個axis
的figure
,多圖的時候往往用一個tuple axes
的__getitem__()
方法來控制每個子圖。
上圖來自官網,圖中的藍字就是matplotlib 認為的一張只有一個axis 的figure 所包含的元素。
兩種API 要做的事情,就是建立figure
和axis
,然後提供函數/方法來生成或者改變各個元素。
基於狀態(state-based)
所謂基於狀態的API,不太好解釋,前面已經說過,在每個函數前面加上plt,剩下的就和寫MATLAB 幾乎完全一樣。
看官網給出的教程,可以觀察到兩個有趣的現象:
- 幾乎沒有賦值運算符
=
- 幾乎所有的
.
前面都是plt
也就是說,與matplotlib 相關的命令都是函數,而且不需要將返回值賦給任何變量。 figure
和axis
的概念被隱藏起來了, plt.figure()
建立一個figure; plt.subplot()
建立多個axes,並且將程序的注意力放到函數參數指定的子圖上;緊跟著的設定各種元素的函數都會作用到之前最新一個plt.subplot()
所指定的子圖上。
沒有賦值說明函數的返回值並不重要,這些函數都會作用在後台維護的figure 和axis 的狀態機上面,也就是說這些函數都有副作用,不是純函數。
面向對象(object-oriented)
作為對比:
- 頭幾句會有賦值運算符
=
,被賦值的變量名一般就是fig
和ax
。 -
.
前面都是fig
和ax
,其中ax
居多。
fig
和ax
分別是matplotlib.figure.Figure
和matplotlib.axes.Axes
兩種對象的實例,畫圖和調整都是在調用兩種對象的方法,主要是ax
的方法。
不同之處Cheat Sheet
絕大多數命令,在兩種API 之下的名字都一樣,差別就在於開頭究竟是plt.
還是ax.
,但是少數命令不同,下面做了一個表格,進行一個不完全的列舉:
其他不同的命令,以後用到的時候會隨手更新。
喜歡我的文章嗎?
別忘了給點支持與讚賞,讓我知道創作的路上有你陪伴。
發布評論…