天天看點

pyplot 入門概念小結轉自: https://zhuanlan.zhihu.com/p/29403480pyplot 入門概念小結

pyplot 入門概念小結轉自: https://zhuanlan.zhihu.com/p/29403480pyplot 入門概念小結

轉自: https://zhuanlan.zhihu.com/p/29403480

pyplot 入門概念小結

pyplot 入門概念小結 知乎的markdown支援實在是太差了,我就不在這裡一個一個代碼顯示樣式了,詳情看我在簡書發的文章。也希望高手指點一下怎麼在知乎裡面用好Markdown。也可以移步我的微信公衆号看,practice_yuyang。更要感謝連圖面都顯示不出來還點贊的同學。

開始學習資料分析,我們可以對照着python操作來學習r操作,反過來當然也可以,因為兩種語言環境的資料操作方法,資料結構都有很強的相似性,甚至有時候名字都是類似的,例如Dataframe資料結構,groupby方法。但是這個畫圖操作,常用的ggplot和pyplot則感覺完全就沒有什麼可以互相借鑒的地方。

ggplot的邏輯我總覺得很好了解,就是不停的疊加圖層。可是學習pyplot總感覺各種懵逼,看了入門教程畫出一些折線圖,柱狀圖,但是看别人的代碼卻好像實作過程完全不一樣,還經常混入各種搞不清楚的概念,例如:

  • Axes - Subplot - Axis 之間到底是個什麼關系?
  • plt.plot() 和 ax.plot() 長得這麼像,功能又一樣,但是好像有有點什麼差別!

我喜歡的學習過程是,在初步了解常用操作後,不求完全了解,直接邊查文檔,邊過别人的代碼,一方面可以了解到到底哪些操作最常用,另一方面可以了解到各種操作之間的互相協作過程。我的基礎想想也知道是不是特别牢靠的。是以才有了以上懵逼,是以 估計認真刷教程的同學應該是沒有這種疑惑的。

1.axes subplot axis先說第一個疑惑 Axes - Subplot - Axis 之間到底是個什麼關系?

因為我是努力在看英文的教程,是以剛開始對axes和axis是基本搞不清的,一個是軸的複數,一個是軸,好像設定圖像屬性的時候經常用axes,具體到某個坐标軸的時候才會用axis。然後教程還說,subplot和axes基本就是一個意思。真是坑坑坑。。。

扛不住,翻了翻中文教程,好像有的教程就直接把axes翻譯成子圖了,好像這個世界就壓根沒有subplot和axes的差別。。看了半天,其實我還是覺得axes翻譯成軸域比較貼切,下面就結合後來看到的各種教程來講講自己最後的了解。

1.1 先明确Figure的概念

pyplot 入門概念小結轉自: https://zhuanlan.zhihu.com/p/29403480pyplot 入門概念小結

import numpy as np import matplotlib.pyplot as plt fig = plt.figure() plt.show()我們先理清figure的概念。用畫闆和畫紙來做比喻的話,figure就好像是畫闆,是畫紙的載體,但是具體畫畫等操作是在畫紙上完成的。在pyplot中,畫紙的概念對應的就是Axes/Subplot。

pyplot 入門概念小結轉自: https://zhuanlan.zhihu.com/p/29403480pyplot 入門概念小結

fig = plt.figure() ax = fig.add_subplot(111) ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes', ylabel='Y-Axis', xlabel='X-Axis') plt.show()

pyplot 入門概念小結轉自: https://zhuanlan.zhihu.com/p/29403480pyplot 入門概念小結

是以就算我們隻有一個子圖,我們也可以生成一個subplot,然後來在對這個subplot對象進行各種軸、标注、刻度等的設定。

1.2 Axes 和 Subplot 的概念上細微的差別fig = plt.figure() ax1 = fig.add_subplot(211) ax2 = fig.add_subplot(212) print type(ax1) plt.show()

pyplot 入門概念小結轉自: https://zhuanlan.zhihu.com/p/29403480pyplot 入門概念小結

第一個例子是用subplot()方法。

subplot()方法很好了解。裡面傳入的三個數字,前兩個數字代表要生成幾行幾列的子圖矩陣,底單個數字代表選中的子圖位置。這個例子中我們生成了2行1列的子圖矩陣。可以分别在兩個subplot中畫圖。

fig = plt.figure() ax3 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) ax4 = fig.add_axes([0.72, 0.72, 0.16, 0.16]) print type(ax3) plt.show()

pyplot 入門概念小結轉自: https://zhuanlan.zhihu.com/p/29403480pyplot 入門概念小結

第二個例子是用add_axes()方法。

我覺得軸域(Axes)的感念确實可以先了解成一些軸(Axis)的集合,當然這個集合還有很多軸(Axis)的屬性,标注等等。我們用add_axes()方法生成一個軸域(Axes),括号裡面的值前兩個是軸域原點坐标(從左下角計算的),後兩個是顯示坐标軸的長度。當我們生成了軸域的時候,從結果上看确實是生成了一個可以畫圖的子圖。我們可以分别在兩個軸域(Axes)中畫圖。

對比兩種方法,兩種對象,我們可以總結總結:

  • 兩種對象确實是“你中有我,我中有你”的關系,生成子圖(subplot)的時候,必然帶着所謂的一套軸域(Axes)。而用軸域(Axes)方法,客觀上就是生成了一個可以畫圖的子圖。
  • add_subplot()方法在生成子圖過程,簡單明了,而用add_axes()方法,則生成子圖的靈活性更強,完全可以實作add_subplot()方法的功能,可以控制子圖顯示位置,甚至實作互相重疊的效果。例如:
pyplot 入門概念小結轉自: https://zhuanlan.zhihu.com/p/29403480pyplot 入門概念小結

2 Axes方法與pyplot函數用野路子法,也就是直接看代碼,不懂的就查文檔,看别人的代碼的時候,圖像的的各種特性經常用兩套方法實作,對學習過真是毀滅性打擊。是以遇到模仿的瓶頸的時候,還是要找些教程看看。這裡基本照搬翻譯,https://github.com/matplotlib/AnatomyOfMatplotlib 教程中的Part1的 Axes methods vs. pyplot 一節。

plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3) plt.xlim(0.5, 4.5) plt.show()

pyplot 入門概念小結轉自: https://zhuanlan.zhihu.com/p/29403480pyplot 入門概念小結

fig = plt.figure() ax = fig.add_subplot(111) print type(ax) ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3) ax.set_xlim(0.5, 4.5) plt.show()

pyplot 入門概念小結轉自: https://zhuanlan.zhihu.com/p/29403480pyplot 入門概念小結

本次畫圖涉及到的兩步操作,畫圖和設定x軸的顯示範圍,分别用前後兩種方法實作。

第一種,調用了pyplot中的 plot() 函數和 xlim() 函數,

第二種,使用了生成的Subplot對象的兩種方法 .plot 和 .set_xlim方法。

實際上,實作整個畫圖過程可以用兩套工具來分别實作,其實這也是貫穿整個python程式設計的兩種思路,函數式程式設計和對象式程式設計。我們在這裡可以比較一下兩套工具的優缺點:

  • 以 plot() 為代表的函數式操作,表達簡潔,但是沒有展現出真正畫圖的實作過程,例如甚至當沒有搞清楚Figure Axes Subplot 等概念的時候,依然可以輕松的用pyplot函數畫圖。當子圖較多的時候,對子圖的操作容易陷入混亂,因為從代碼上并不能位元組觀察出到底在操作那張子圖。
  • 以 .plot 為代表的對象式操作,表達明确,分步生成 Figure 和 Axes/Subplot,操作過程直接可以看出是在那張子圖上操作。但是缺點就是,需要寫的代碼比較多,不夠簡潔。

這裡要吐槽一下我看的這個教程,作者提出了在 PEP20 中,“Python之道”(The Zen of Python)提到了“明了勝于晦澀”(Explicit is better than implicit),是以作者在整個教程中都是使用了對象式的方法。但是其實”Python之道“的下一句就是“簡潔勝于複雜”(Complex is better than complicated)。

是以,還是看你的使用場景,假如不需要畫子圖的時候,用一用簡單的pyplot方法也沒什麼不好。但是初學者最好還是能夠堅持先使用Axes對象屬性的方法,這樣對于畫圖的實作過程可以加深了解。

3 補充自己看代碼,有時候不太了解的代碼寫法。

  • fig, ax = plt.subplots()

這個寫法其實就是一下兩行代碼的縮寫版。

fig = plt.figure() ax = fig.add_subplot(111) plt.show()

pyplot 入門概念小結轉自: https://zhuanlan.zhihu.com/p/29403480pyplot 入門概念小結

當然有子圖的實作過程,也是可以的。“

fig, axes = plt.subplots(nrows=2, ncols=2) axes[0,0].set(title='Upper Left') axes[0,1].set(title='Upper Right') axes[1,0].set(title='Lower Left') axes[1,1].set(title='Lower Right') # 周遊整個axes。flat方法是将整個numpy對象轉換成了1維對象,然後周遊。 for ax in axes.flat: # Remove all xticks and yticks... ax.set(xticks=[], yticks=[]) plt.show()

pyplot 入門概念小結轉自: https://zhuanlan.zhihu.com/p/29403480pyplot 入門概念小結

flat方法https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flat.html

參考資料:

  • https://github.com/matplotlib/AnatomyOfMatplotlibgithub上的教程
  • https://www.datacamp.com/community/tutorials/matplotlib-tutorial-python#gs.alh6j1c Datacamp中帶運作環境的教程

繼續閱讀