目錄
前言
學習matplotlib有一段時間了,總感覺學不到本質的東西,抓不到主要的重點,還是感覺有些吃力,畫的圖千變萬化,總不能一一學會吧,今天我們就來總結一下,matplotlib本質的東西,讓我們更能在全局上掌握matplotlib庫。
(一)總框架分析
在matplotlib庫里,總分成兩種繪圖方法
- 方法一:函數式繪圖
- 方法二:面向對象式繪圖
(二)函數式的繪圖
1.說明:
在matplotlib.pyplot里是封裝好的函數,用戶可以直接調用函數進行繪圖。
一般的,我們約定 matplotlib.pyplot 取別名為 plt
其模塊下主要定義如下兩方面的函數:
- 操作類的函數:對於畫布,圖,子圖,坐標軸,圖例,背景,網格等的操作。
如:plt.ylabel(), plt.xlabel(), plot.yscale(), plt.legend(), plt.title(), plt.text()……
- 繪圖類的函數:畫折線圖,散點圖,條形圖,直方圖,餅狀圖等特點圖的繪制函數。
如:plt.scatter, plt.plot(), plt.bar, plot.pie(), plt.hise()……
具體可以參考官方網站
2.函數繪圖的缺優點
(1)缺點:
其實函數式的繪圖本質上還是在matplotlib對象的封裝,在對象的基礎上多了一層函數的調用,
其定制性並不是很強,都是封裝好的函數。
(2)優點:
適合一般用戶繪圖,要求不是很高,定制性不是很強的繪圖。
新手容易上手,不需要了解內部的對象問題。
3.繪圖類的函數
matplotlib繪圖不止這些,在此只舉例了大部分
| 序號 | 繪圖函數(plt.xxx) | 說明 |
|---|---|---|
| 1 | acorr() |
繪制x的自相關圖 |
| 2 | angle_spectrum() |
繪制角度譜圖 |
| 3 | bar() |
制作條形圖 |
| 4 | barbs() |
繪制倒鈎的二維場圖 |
| 5 | barh() |
制作水平條形圖。 |
| 6 | boxplot() |
制作一個盒子和胡須圖 |
| 7 | broken_barh() |
繪制一個水平的矩形序列圖 |
| 8 | clabel() |
繪制等高線圖 |
| 9 | cohere() |
繪制x和y之間的一致性圖 |
| 10 | csd() |
繪制交叉譜密度圖 |
| 11 | eventplot() |
繪制相同的平行線 |
| 12 | fill() |
繪制填充多邊形圖 |
| 13 | hexbin() |
制作六邊形分箱圖 |
| 14 | hist() |
繪制直方圖 |
| 15 | hist2d() |
制作2D直方圖 |
| 16 | magnitude_spectrum() |
繪制幅度譜圖 |
| 17 | phase_spectrum() |
繪制相位譜圖 |
| 18 | pie() |
繪制餅圖 |
| 19 | plot() |
繪制折線圖 |
| 20 | plot_date() |
繪制包含日期的數據圖 |
| 21 | quiver() |
繪制一個二維箭頭場圖 |
| 22 | scatter() |
繪制散點圖 |
| 23 | specgram() |
繪制頻譜圖 |
| 24 | stackplot() |
繪制堆積區域圖 |
| 25 | streamplot() |
繪制矢量流的流線型圖 |
| 26 | triplot() |
繪制非結構化三角形網格作為線條圖 |
4.操作類的函數
操作不止這些,在這只是舉了大部分
| 序號 | 操作函數(plt.xxx) | 說明 |
|---|---|---|
| 1 | arrow() |
向軸添加箭頭 |
| 2 | axes() |
控制軸的范圍 |
| 3 | axhline() |
在軸上添加水平線 |
| 4 | axhspan() |
在軸上添加水平跨度(矩形) |
| 5 | axvline() |
在軸上添加垂直線 |
| 6 | axvspan() |
在軸上添加垂直跨度(矩形) |
| 7 | box() |
打開或關閉軸框 |
| 8 | figlegend() |
在圖中放置一個圖例 |
| 9 | figtext() |
添加文字到圖 |
| 10 | grid() |
配置網格線 |
| 11 | legend() |
在軸上放置圖例 |
| 12 | locator_params() |
控制軸的刻度緊密度。 |
| 13 | loglog() |
在x軸和y軸上繪制具有對數縮放的繪圖 |
| 14 | margins() |
設置繪圖到框的邊距 |
| 15 | minorticks_on() |
在軸上顯示次要刻度 |
| 16 | minorticks_off() |
從軸上移除次要刻度 |
| 17 | subplot() |
在當前圖中添加子圖 |
| 18 | subplot2grid() |
在常規網格內的特定位置創建軸 |
| 19 | subplots() |
創建一個圖形和一組子圖 |
| 20 | subplots_adjust() |
調整子圖布局 |
| 21 | suptitle() |
為圖中添加居中標題 |
| 22 | table() |
將表添加到當前軸 |
| 23 | text() |
向軸添加文本 |
| 24 | tick_params() |
更改刻度,刻度標簽和網格線的外觀 |
| 25 | title() |
設置軸的標題 |
| 26 | twinx() |
制作共享x軸的第二個軸 |
| 27 | twiny() |
制作共享y軸的第二個軸 |
| 28 | xlabel() |
設置x軸的標簽 |
| 29 | xlim() |
獲取或設置當前軸的x限制 |
| 30 | xscale() |
設置x軸刻度 |
| 31 | xticks() |
獲取或設置當前刻度線位置和x軸標簽 |
| 32 | ylabel() |
設置y軸的標簽 |
| 33 | ylim() |
獲取或設置當前軸的y限制 |
| 34 | yscale() |
設置y軸刻度 |
| 35 | yticks() |
獲取或設置y軸的當前刻度位置和標簽 |
5.例子:
(1)源代碼
# 導入模塊
import matplotlib.pyplot as plt
import numpy as np
# 數據
x = np.linspace(0, 2*np.pi, 1000)
y = np.sin(x**2)
# 繪圖
plt.plot(x, y)
# 顯示
plt.show()
(2)顯示效果

(三)面向對象式的繪圖
1.基本概念
面向對象式的繪圖,才是matplotlib繪圖最自然的方式,不過需要先了解一些基本的概念。
可參考官方介紹:https://matplotlib.org/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py
下圖是matplotlib基本的組成部分

figure(圖形)
axes(子圖形)
title(標題)
legend(圖例)
Major tick(大標尺刻度)
Minor tick(小標尺刻度)
Major tick label(大標尺刻度數值)
Minor tick label(小標尺刻度數值)
Y axis label(y軸指標說明)
X axis label(x軸指標說明)
Line(線型圖)
Markers(數據標注點)
Grid(格子)等等
2.基本對象
(1)Figure
- 整個圖形即是一個Figure對象,即一個彈出的繪圖的窗口,便是一個figure。
- Figure對象至少包含一個子圖,也就是Axes對象。
- Figure對象包含一些特殊的Artist對象,如title標題、圖例legend。
- Figure對象包含畫布canvas對象。 canvas對象一般不可見,通常無需直接操作該對象,matplotlib程序實際繪圖時需要調用該對象。
(2)Axes
- 字面上理解,axes是數據軸axis的復數,但它並不是指數據軸,而是子圖對象。可以這樣理解,每一個子圖都有x和y軸,axes則用於代表這兩個數據軸所對應的一個子圖對象。
- 常用方法set_xlim()以及set_ylim():
- 設置子圖x軸和y軸對應的數據范圍。
- set_title():設置子圖的標題。
- set_xlabel()以及set_ylable():
- 設置子圖x軸和y軸指標的描述說明。
(3)Axis
- Axis是數據軸對象,主要用於控制數據軸上刻度位置和顯示數值。
- Axis有Locator和Formatter兩個子對象,分別用於控制刻度位置和顯示數值。
(4)Artist
- 基本上所有的對象都是一個Artist對象,包括Figure對象、Axes對象和Axis對象,可以將Artist理解為一個基本類。
- 當提交代碼,圖像最終呈現時,所有的artist對象都會繪制於canvas畫布上
層級結構圖:

(yaxis同樣有tick, label和tick label,沒有畫出)
3.面向對象式繪圖的缺優
(1)缺點:
對於新手不友好,感念混淆,不易掌握,上手慢。
(2)優點:
可定制性強,靈活,自然,流暢。
4.例子:
(1)源代碼
# 導入模塊
import matplotlib.pyplot as plt
import numpy as np
# 數據
x = np.linspace(0, 2*np.pi, 1000)
y = np.sin(x**2)
# 創建一張圖
fig, ax = plt.subplots(1, 1)
plt.plot(x, y)
# 顯示
plt.show()
(2)輸出效果
[圖片上傳失敗...(image-66cc5e-1552302327631)]
參考網站
【1】python matplotlib畫圖教程學習:使用介紹https://baijiahao.baidu.com/s?id=1614559225877861604&wfr=spider&for=pc
【2】matplotlib核心剖析:https://blog.csdn.net/zchshhh/article/details/78215646
