鄙人覺得,在matplotlib
中仍是推薦使用面向對象的方法,由於它能夠更好的控制和自定義繪圖。
先送各位一張寶貝,這是我從matplotlib
官方文檔中摘下來的,拿走不謝,該圖顯示了大部分繪圖元素:
html
Matplotlib
,pyplot
和pylab
三者的相(ai)互(hen)關(qing)系(chou)——該條目摘自官方文檔python
Matplotlib
是整個包matplotlib.pyplot
是 matplotlib
中的一個模塊;pylab
是一個與 matplotlib
一塊兒安裝的模塊。Pyplot
爲底層面向對象的繪圖庫提供狀態機接口。 狀態機隱式地 自動建立圖形和軸 以實現所需的圖形,例如:數組
x = np.linspace(0, 2, 100) plt.plot(x, x, label='linear') plt.plot(x, x**2, label='quadratic') plt.plot(x, x**3, label='cubic') plt.xlabel('x label') plt.ylabel('y label') plt.title("Simple Plot") plt.legend() plt.show()
第一次調用 plt.plot
將自動建立必要的圖形和軸以實現所需的繪圖。隨後對plt.plot
的調用會從新使用當前軸,而且每次都會添加另外一行。設置標題,圖例和軸標籤還會自動使用當前軸並設置標題,建立圖例並分別標記軸。dom
pylab
是一個便利模塊,至關於在單個名稱空間中批量導入 matplotlib.pyplot
(用於繪圖)和numpy
同樣(用於數學和使用數組)。不過不推薦使用pylab
,而且因爲命名空間污染而強烈建議不要使用它。請改用pyplot
。spa
matplotlib
繪圖對象感性理解參考自:
https://finthon.com/matplotli...code
Matplotlib
中大的對象主要分爲三個,FigureCanvas
(畫布、畫布層),Figure
(圖、圖像層),Axes
(座標軸、繪製的區域——軸域、座標層)(概念劃分參考自:https://www.cnblogs.com/dajun...) FigureCanvas
(畫布)涉及到底層操做,咱如今的水平就甭接觸了8[手動滑稽] matplotlib
繪圖,一個很是基礎的問題就是要搞清楚圖(圖像層)和座標軸(座標層)倆對象。只有真正瞭解這兩個概念,才能得到對整個繪圖過程的控制權。Figure
對象 import matplotlib.pyplot as plt plt.figure() plt.show()
使用 plt.figure()
建立一個Figure
對象,經過 plt.show()
顯示出來:
運行下看看:htm
空的,啥都沒有,你懂得對象
axes
對象 有了圖像層,接下來就在圖像層上繪圖,所以咱們首先須要建立一個座標軸,能夠調用Figure
實例的 add_axes
方法:blog
fig = plt.figure() ax = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # [距離左邊,下邊,座標軸寬度,座標軸高度] 範圍(0, 1) plt.show()
[0.1, 0.1, 0.8, 0.8]
表示的是在圖像層中,座標軸區域(座標層)距離畫布左邊0.1倍的位置,距離下邊0.1倍的位置,肯定了這兩個位置後,座標軸的總體寬度和高度佔0.8倍的大小,換句話說,距離右邊和上邊0.9(0.1+0.8)倍。獲得以下結果:
接口
若是你以前就接觸過一些繪圖的命令,你會發現:
plt.plot([0, 1, 2]) plt.show()
直接使用這兩個命令就能繪圖呀,居然沒有定義畫布和座標軸,獲得以下圖:
這是由於matplotlib
會在最近用過的座標層上進行繪圖,若是沒有的話,默認會建立一個圖對象(圖像層)和座標軸(座標層)。可是顯示建立圖對象(圖像層)和座標軸(座標層)的好處是讓咱們對繪圖過程有了徹底的控制權(好比能夠指定在什麼地方繪圖),並且繪圖的邏輯更強。接下來咱們繪製一張圖中圖來理解這個過程:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 10) y = np.sin(x) # 建立畫布 fig = plt.figure() # 建立座標軸 ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # 第一個座標軸的範圍 ax2 = fig.add_axes([0.2, 0.5, 0.4, 0.3]) # 第二個座標軸的範圍 ax1.plot(x, y, 'r') ax2.plot(x, y, 'g') plt.show()
咱們獲得了以下圖像:
在這裏咱們建立了兩個座標軸 ax1
和 ax2
,分別對兩個座標層指定範圍並做圖
在建立 Figure 對象的時候,咱們可使用 figsize 和 dpi 控制圖片尺寸。好比:
fig = plt.figure(figsize=(16,8), dpi=100)
figsize
表示畫布長寬大小,單位爲英寸; dpi
表示每英寸的像素值。所以上面的命令就建立了一張1600*800像素的畫布。
從上面輸出的結果來看, plt.show()
並非輸出一張圖片,而是一個交互式的繪圖界面。若是要保存圖片,還須要經過 savefig()
保存。沒有顯式指定畫布和座標軸,直接使用 plt.savefig()
保存也能夠,顯式指明瞭圖對象(繪圖層)能夠用Figure
實例的方法 fig.savefig()
。matplotlib
能夠生成多種格式的高質量圖像,包括PNG,JPG,EPS,SVG,PGF 和 PDF,只要寫好後綴名便可:
fig.savefig("result.png")
建議按照顯式的方法去繪圖:先建立畫布,再建立座標軸,最後在座標軸上繪圖。這種代碼方式會讓繪圖邏輯更加清晰,可以爲所欲爲的修改圖片的每一個地方。
matplotlib
中子圖對象AxesSubplot
import matplotlib.pyplot as plt import numpy as np x = np.arange(1,10,1) y = np.random.randn(len(x)) fig = plt.figure() #產生一個畫布 ax = fig.add_subplot(111) #在畫布上建立一個子圖 ax.plot(x,y) ax.set_title("object oriented") #設置子圖標題 plt.show()
聽中文名字感受一下,子圖?是否是也得添加座標層才能繪圖?
如今只建立子圖畫布:
import matplotlib.pyplot as plt import numpy as np x = np.arange(1,100,1) fig = plt.figure() ax1 = fig.add_subplot(211) plt.show()
咱們能夠看到,咱們沒有給子圖添加座標層,可是卻顯示了座標,和咱們以前直接顯示plt.figure()
不一樣。
咱們再瞅一眼子圖的「英文名字」——AxesSubplot
你是否是懂了啥?[手動滑稽]
對的,這個子圖是自帶繪圖層的,明白了這個那就ojbk啦
AxesSubplot
別的用法 在繪圖層(figure
對象上)上建立兩個子圖(一行兩列),都顯示出來
import matplotlib.pyplot as plt import numpy as np x = np.arange(1,100,1) fig = plt.figure() ax1 = fig.add_subplot(121) ax1.plot(x,x) ax2 = fig.add_subplot(122) ax2.plot(x,x*x) plt.show()
此處能夠和pyplot
繪圖方式簡單對比一下:
import matplotlib.pyplot as plt import numpy as np x = np.arange(1,100,1) plt.subplot(121) plt.plot(x, x) plt.subplot(122) plt.plot(x, x*x) plt.show()
我就不解釋了哈,都能看懂8
其實,這裏還須要解釋一下plt.subplot()
和 fig.add_subplot()
參數的含義
若參數傳入231和535,顯然不匹配,若用plt.subplot()
則只會顯示後者,若用 fig.add_subplot()
則都會顯示出來,但有可能會重疊,顯而後者在上方
import matplotlib.pyplot as plt import numpy as np x = np.arange(1,10) fig = plt.figure() ax = fig.add_subplot(111) ax.plot(x,x*2) ax.grid(color='g',linestyle='--') plt.show()
你懂得,這個ax.grid()
對應plt.grid()
import matplotlib.pyplot as plt import numpy as np x = np.arange(1,11) fig = plt.figure() ax = fig.add_subplot(111) ax.plot(x,x,label='inline label') ax.legend() plt.show()
同理,ax.legend()
對應plt.legend()
以上參考自(有刪改):https://zhuanlan.zhihu.com/p/...
AxesSubplot 方式 |
pyplot 方式 |
---|---|
ax.set_title() | plt.title() |
ax.set_xlabel() | plt.xlabel() |
ax.set_ylabel() | plt.ylabel() |
ax.set_xlim() | plt.xlim() |
ax.set_ylim() | plt.ylim() |
就先這樣吧,困了......