matplotlib:先搞明白plt.

我這個傻子的matplotlib學習過程很神奇:

剛開始,找幾個教程,嘔吼,簡單,plt.*** 一頓寫。畫完了。遇到座標啊之類的細節不會調?

打開谷歌,要啥搜啥。

matplotlib:先搞明白plt. /ax./ fig再畫,請堅持使用一種格式

我最開始覺得這樣蠻好的,這是一個很容易學的lib嘛。

然後問題出現了,matplotlib最煩人的地方就是,同樣一個目標,你可以有N種不同的方法去實現他。比如說哦,加標題:

<code>plt.set_title() 可以吧。
ax.title.set_text('title') 也可以吧。
ax.set_title()也可以啊。/<code>

所以到底要用哪個??

matplotlib:先搞明白plt. /ax./ fig再畫,請堅持使用一種格式

當你在網上搜索答案的時候,你會遇到各種實現的方法,如果你只是單純的把找到的答案copypaste,那總有一天你會和我一樣崩潰。感覺自己就是個沒有谷歌就不會畫圖的傻子。。。

所以,如果你:

  • 學習matplotlib的時候是從標題類似於"五分鐘教你matplotlib畫圖” 這種教程開始的
  • 起碼知道這一句 'import matplotlib.pyplot as plt'
  • 遇到稍微複雜的細節就要一頓查,遇到修改xy座標,名稱,等等就頭大
  • 打開matplotlib的官方指南,不止一次,但是一臉懵逼
  • 在這幾個詞 figure, axes, axis 在matplotlib出現時就一臉完了的表情

那麼你不是一個人。我一直和你在一起。

所以這份指南是用來(嘗試)解決這個問題的。我們花短短的時間,來從根本上了解一下matplotlib的架構,各種名詞是什麼意思,一個正常的畫圖程序是什麼。

matplotlib:先搞明白plt. /ax./ fig再畫,請堅持使用一種格式

plt.***和ax.***的區別

我認為所有不先講清楚plt.***和ax.*** 兩種畫圖方式的區別的教程都是耍流氓。一上來就告訴你,plt.figure(), plt.plot(), plt.show(),這麼畫就對了的,都是不負責任的表現!

  • 在matplotlib中,有兩種畫圖方式:
    • plt.figure(): plt.***系列。通過http://plt.xxx來畫圖,其實是取了一個捷徑。這是通過matplotlib提供的一個api,這個plt提供了很多基本的function可以讓你很快的畫出圖來,但是如果你想要更細緻的精調,就要使用另外一種方法。
<code>plt.figure(1)  
plt.subplot(211)
plt.plot(A,B)
plt.show()/<code>
    • fig, ax = plt.subplots(): 這個就是正統的稍微複雜一點的畫圖方法了。指定figure和axes,然後對axes單獨操作。等下就講figure和axes都神馬意思。
<code>fig, ax = plt.subplots()   
ax.plot(A,B)/<code>
matplotlib:先搞明白plt. /ax./ fig再畫,請堅持使用一種格式

  • 大部分的新手教程,都是以http://plt.xxx開始的。我個人認為這不是一個很好的方式。的確, http://plt.xxx簡單易懂上手快,但是plt把matplotlib的結構看成一個blackbox,新手在不知道這個lib到底是如何運作的情況下以為自己上手了,可是當你需要細調你的圖的時候,你就發現你完全不明白網上的人為什麼要用http://ax.xxx, 為什麼還有其他那麼多種方式來加題目。這樣的學習過程是非常不利於長期發展的。
  • 因此,從我這個傻子的經驗,我強烈建議在初學matplotlib的時候,儘量避免使用http://plt.xxx系列。當你明白figure/axes/axis都是控制什麼的時候,如果你想要簡單的製作一個quick and dirty的圖,用http://plt.xxx才是OK。

名詞解釋 in matplotlib

matplotlib的名詞定於對於非英語母語的人來說實在是太不友好了。尤其是axes。仰天長嘯。

從官方借了個圖


matplotlib:先搞明白plt. /ax./ fig再畫,請堅持使用一種格式

  • Figure fig = plt.figure(): 可以解釋為畫布。
    • 畫圖的第一件事,就是創建一個畫布figure,然後在這個畫布上加各種元素。
  • Axes ax = fig.add_subplot(1,1,1): 不想定義,沒法定義,就叫他axes!

1.首先,這個不是你畫圖的xy座標抽!

2. 希望當初寫這個lib的時候他們用一個更好的名字。。。

3.可以把axes理解為你要放到畫布上的各個物體。比如你要畫一個太陽,一個房子,一個車在

4.畫布上,那麼太陽是一個axes,房子是一個axes,etc。

5.如果你的figure只有一張圖,那麼你只有一個axes。如果你的figure有subplot,那麼每一個subplot就是一個axes

6.axes是matlibplot的宇宙中心!axes下可以修改編輯的變量非常多,基本上能包含你的所有需求。

  • Axis ax.xaxis/ax.yaxis: 對,這才是你的xy座標軸。

每個座標軸實際上也是由豎線和數字組成的,每一個豎線其實也是一個axis的subplot,因此ax.xaxis也存在axes這個對象。對這個axes進行編輯就會修改xaxis圖像上的表現。

圖像的各個部位名稱

再從使用指南 User Guide 借個圖。每個部分的名稱指南,這樣當你想修改一個部位的時候,起碼知道關鍵字啊。

matplotlib:先搞明白plt. /ax./ fig再畫,請堅持使用一種格式

一步一步來,用傳統方法畫個圖

下面就是實戰。用調取ax的方式來畫個圖。不要用plt!!

Import library and data for ploting

<code>import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
A = np.arange(1,5)
B = A**2
C = A**3/<code>

首先,搞個畫布

我喜歡用這個命令來開始畫圖。哪怕你沒有subplot,也可以用這個subplots來創建一個畫布。

這個function創建了一個大小為(14,7)的畫布,把這個畫布賦值給變量fig,同時在這個畫布上創建了一個axes,把這個axes賦值給ax。這樣,所有未來的http://fig.xxx都是對這個畫布的操作,所有http://ax.xxx都是對這個axes的操作。

如果你有兩個圖,那麼ax是一個有兩個元素ax[0],ax[1] 的list。ax[0]就對應第一個subplot的ax。

<code>fig, ax = plt.subplots(figsize=(14,7))
# fig, ax = plt.subplots(2,1,figsize(14,7))
# ax[0].***
# ax[1].***/<code>


matplotlib:先搞明白plt. /ax./ fig再畫,請堅持使用一種格式

好了畫布搞好了,畫數據。

注意,我們這裡依然不使用plt!因為我們要在這個axes上畫數據,因此就用ax.plot()來畫。畫完第一個再call一次,再畫第二個。

<code>ax.plot(A,B)
ax.plot(B,A)/<code>


matplotlib:先搞明白plt. /ax./ fig再畫,請堅持使用一種格式

下面開始細節的處理

數據畫好了就可以各種細調座標軸啊,tick啊之類的。

首先把標題和xy座標軸的標題搞定。Again, 不用plt。直接在axes上進行設定。

<code>ax.set_title('Title',fontsize=18)
ax.set_xlabel('xlabel', fontsize=18,fontfamily = 'sans-serif',fontstyle='italic')
ax.set_ylabel('ylabel', fontsize='x-large',fontstyle='oblique')
ax.legend()/<code>

然後是xy座標軸的一些屬性設定, 也是在axes level上完成的

<code>ax.set_aspect('equal') 
ax.minorticks_on()
ax.set_xlim(0,16)
ax.grid(which='minor', axis='both')/<code>

最後是座標軸tick和細節,這個在axes.xaxis or axes.yaxis上完成。

<code>ax.xaxis.set_tick_params(rotation=45,labelsize=18,colors='w') 
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end,1))
ax.yaxis.tick_right()/<code>
matplotlib:先搞明白plt. /ax./ fig再畫,請堅持使用一種格式

這樣一個醜陋的基本圖的繪畫和編輯就完成了。如果有一些其他的細節調整,在搜索的時候,儘量選擇不用plt的答案。原則上來說,plt和ax畫圖兩者是可以互相轉換的,然而轉換過程讓你的代碼更復雜,有時還會產生難以理解的bug。因此畫圖的時候,請堅持使用一種格式。

結尾:

小編近幾年在學習Python!對於想學習Python的朋友們,我想說:很多人學了一個星期就放棄了,為什麼呢?其實沒有好的學習資料給你去學習,你們是很難堅持的,這是小編收集的Python入門學習資料關注,轉發,後臺(我主頁上方)“滴滴”小編“06”,即可免費領取!希望對你們有幫助!


分享到:


相關文章: