matplotlib面向對象繪圖小白終結版

0.寫在前面

鄙人覺得,在matplotlib中仍是推薦使用面向對象的方法,由於它能夠更好的控制和自定義繪圖。
先送各位一張寶貝,這是我從matplotlib官方文檔中摘下來的,拿走不謝,該圖顯示了大部分繪圖元素:
clipboard.pnghtml


1.先看看Matplotlibpyplotpylab三者的相(ai)互(hen)關(qing)系(chou)

——該條目摘自官方文檔python

  • Matplotlib是整個包
  • matplotlib.pyplotmatplotlib中的一個模塊;
  • 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()

clipboard.png
第一次調用 plt.plot自動建立必要的圖形和軸以實現所需的繪圖。隨後對plt.plot的調用會從新使用當前軸,而且每次都會添加另外一行。設置標題,圖例和軸標籤還會自動使用當前軸並設置標題,建立圖例並分別標記軸。dom

pylab是一個便利模塊,至關於在單個名稱空間中批量導入 matplotlib.pyplot(用於繪圖)和numpy同樣(用於數學和使用數組)。不過不推薦使用pylab,而且因爲命名空間污染而強烈建議不要使用它。請改用pyplotspa

2.matplotlib繪圖對象感性理解

參考自:
https://finthon.com/matplotli...code

2.1.簡介

  • Matplotlib中大的對象主要分爲三個,FigureCanvas(畫布、畫布層),Figure(圖、圖像層),Axes(座標軸、繪製的區域——軸域、座標層)(概念劃分參考自:https://www.cnblogs.com/dajun...)
  • FigureCanvas(畫布)涉及到底層操做,咱如今的水平就甭接觸了8[手動滑稽]
  • 能夠說使用matplotlib繪圖,一個很是基礎的問題就是要搞清楚(圖像層)和座標軸(座標層)倆對象。只有真正瞭解這兩個概念,才能得到對整個繪圖過程的控制權。

2.2.Figure對象

import matplotlib.pyplot as plt

plt.figure()
plt.show()

使用 plt.figure() 建立一個Figure對象,經過 plt.show() 顯示出來:
運行下看看:htm

clipboard.png
空的,啥都沒有,你懂得對象

2.3.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)倍。獲得以下結果:
clipboard.png接口

2.4.自動建立對象

若是你以前就接觸過一些繪圖的命令,你會發現:

plt.plot([0, 1, 2])
plt.show()

直接使用這兩個命令就能繪圖呀,居然沒有定義畫布和座標軸,獲得以下圖:
clipboard.png
這是由於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()

咱們獲得了以下圖像:
clipboard.png
在這裏咱們建立了兩個座標軸 ax1ax2 ,分別對兩個座標層指定範圍並做圖

2.5.圖片尺寸大小

在建立 Figure 對象的時候,咱們可使用 figsizedpi 控制圖片尺寸。好比:

fig = plt.figure(figsize=(16,8), dpi=100)

figsize 表示畫布長寬大小,單位爲英寸; dpi 表示每英寸的像素值。所以上面的命令就建立了一張1600*800像素的畫布。

2.5.保存圖片

從上面輸出的結果來看, plt.show() 並非輸出一張圖片,而是一個交互式的繪圖界面。若是要保存圖片,還須要經過 savefig() 保存。沒有顯式指定畫布和座標軸,直接使用 plt.savefig() 保存也能夠,顯式指明瞭圖對象(繪圖層)能夠用Figure實例的方法 fig.savefig()matplotlib 能夠生成多種格式的高質量圖像,包括PNG,JPG,EPS,SVG,PGF 和 PDF,只要寫好後綴名便可:

fig.savefig("result.png")

2.6.小結

建議按照顯式的方法去繪圖:先建立畫布,再建立座標軸,最後在座標軸上繪圖。這種代碼方式會讓繪圖邏輯更加清晰,可以爲所欲爲的修改圖片的每一個地方。

3.matplotlib中子圖對象AxesSubplot

3.1.先上實例代碼感受一下:

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()

clipboard.png
聽中文名字感受一下,子圖?是否是也得添加座標層才能繪圖?
如今只建立子圖畫布

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()

clipboard.png
咱們能夠看到,咱們沒有給子圖添加座標層,可是卻顯示了座標,和咱們以前直接顯示plt.figure()不一樣。
咱們再瞅一眼子圖的「英文名字」——AxesSubplot
你是否是懂了啥?[手動滑稽]
對的,這個子圖是自帶繪圖層的,明白了這個那就ojbk啦

3.2.接下來,我們看一看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()

clipboard.png


此處能夠和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()參數的含義
若參數傳入231535,顯然不匹配,若用plt.subplot()則只會顯示後者,若用 fig.add_subplot()則都會顯示出來,但有可能會重疊,顯而後者在上方

3.3.添加網格

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()

clipboard.png

你懂得,這個ax.grid()對應plt.grid()

3.4.顯示圖例

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()

clipboard.png
同理,ax.legend()對應plt.legend()
以上參考自(有刪改):https://zhuanlan.zhihu.com/p/...

3.5.其餘對比

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()

就先這樣吧,困了......

相關文章
相關標籤/搜索