by 潮汐
今天我們一起來探究 Python 中一個很有趣的模塊--Matplotlib,Matplotlib 是一個非常優秀的 Python 2D 繪圖庫,只要給出符合格式的數據,通過 Matplotlib 就可以方便地製作數據圖。
一、初識 Matplotlib
- Matplotlib 以多種硬拷貝格式和跨平臺的交互式環境生成出版物質量的圖形。Matplotlib 可用於 IPython 腳本,Python 和 IPython Shell,Jupyter 筆記本,Web應用程序服務器和四個圖形用戶界面工具包。
- Matplotlib 嘗試使容易的事情變得容易,使困難的事情變得可能。在實踐過程中只需幾行代碼就可以生成圖表,比如直方圖、功率譜、條形圖、誤差圖、散點圖等。
1、 IPython
IPython 是 Python 的一個增強版本。它在下列方面有所增強:命名輸入輸出、使用系統命令(shell commands)、排錯(debug)能力。我們在命令行終端給 IPython 加上參數 -pylab (0.12 以後的版本是 --pylab)之後,就可以像 Matlab 或者 Mathematica 那樣以交互的方式繪圖。
2、pylab
pylab 是 matplotlib 面向對象繪圖庫的一個接口。它的語法和 Matlab 十分相近。也就是說,它主要的繪圖命令和 Matlab 對應的命令有相似的參數。
二、 安裝
在線安裝
安裝 Matplotlib 包與安裝其他 Python 包一樣,都可以使用 pip 來安裝。
啓動命令行窗口,在命令行窗口中輸入如下命令:
pip3 install matplotlib
輸入上面的命令後會自動下載安裝 Matplotlib 包的最新版本。下載完成後會安裝,最後提示 Matplotlib 包安裝成功:
Installing collected packages: matplotlib
Successfully installed matplotlib-3.1.1
離線安裝
在有網絡限制條件下我們需要下載離線包來安裝,python matplotlib 離線安裝需要提前下載好與 python 版本對應的 wheel 安裝包,下載地址
在上圖中選擇相應的安裝包下載即可,cp36
表示 python 是 3.6 版本,同樣的 cp37
表示 python 是3.7 版本,同樣可以在 python 命令行下使用一下命令查看支持的版本屬性:
>>>python
>>> import pip._internal
>>> print(pip._internal.pep425tags.get_supported())
以上結果可以顯示出相應的版本支持,下載好後 使用 pip命令安裝即可成功:
pip install matplotlib-3.1.1-cp36-cp36m-manylinux1_x86_64.whl
三、matplotlib 架構
1、matplotlib 架構圖
matplotlib 框架分爲三層,這三層構成了一個棧,上層可以調用下層,三層框架描述如下:
- 腳本層 (pyplot):簡化了完成數據分析與可視化的常規操作。 管理創建圖形、座標軸以及他們與後端層的連接。
- 藝術家層 (artist):管理漂亮圖形背後的大多數內部活動。
- 後端層 (backend):matplotlib 的底層,實現了大量的抽象接口類;還和用戶界面工具箱整合在一起;可以將圖形保存爲不同格式(比如PDF、PNG、PS和SVG等)。
這三層屬於matplotlib程序包的範疇,腳本層(pytplot模塊)可以提供給我們一個與matplotlib打交道的接口,我們可以只通過調用pyplot模塊的函數從而操作整個程序包,來繪製圖形。
2、matplotlib 編程接口
matplotlib 編程接口由 3 層組成,組成描述如下:
- 第一層狀態機環境,是由 pyplot 提供的。
- 第二層是有 pyplot 和麪向對象(oo)接口提供,由 pyplot 獲取 figure 對象,通過面向對象接口來顯示地管理axies 對象。
- 第三層由面向對象(oo)接口提供,該層完全不使用 pyplot 模塊。
編程接口圖:
四、matplotlib 繪圖概念
1、 繪圖方式
在matplotlib庫裏,總分成兩種繪圖方式
- 方法一:函數式繪圖
繪圖方法通過調用一系列函數傳入數據繪製出相應的圖,
在 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()……
繪圖部分函數如下:
序號 | 繪圖函數(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() | 繪製非結構化三角形網格作爲線條圖 |
- 方法二:面向對象式繪圖
面向對象式的繪圖,纔是matplotlib繪圖最自然的方式
下圖是 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 | 格子 |
基本對象描述如下:
- Figure(圖)
指整個圖形(包括所有的元素,比如標題、線等)。 管理着所有的座標系,還有一些特殊的藝術家和canvas(畫布)。
- 整個圖形即是一個Figure對象,即一個彈出的繪圖的窗口,便是一個figure。
- Figure對象至少包含一個子圖,也就是Axes對象。
- Figure對象包含一些特殊的Artist對象,如title標題、圖例legend。
- Figure對象包含畫布canvas對象。 canvas對象一般不可見,通常無需直接操作該對象,matplotlib程序實際繪圖時需要調用該對象。
- Axes(座標系)
數據的繪圖區域
- 字面上理解,axes是數據軸axis的複數,但它並不是指數據軸,而是子圖對象。可以這樣理解,每一個子圖都有x和y軸,axes則用於代表這兩個數據軸所對應的一個子圖對象。
-常用方法set_xlim()以及set_ylim():- 設置子圖x軸和y軸對應的數據範圍。
- set_title():設置子圖的標題。
- set_xlabel()以及set_ylable():
- 設置子圖x軸和y軸指標的描述說明。
- Axis(座標軸)
座標系中的一條軸,包含大小限制、刻度和刻度標籤。
- Axis是數據軸對象,主要用於控制數據軸上刻度位置和顯示數值。
- Axis有Locator和Formatter兩個子對象,分別用於控制刻度位置和顯示數值。
- artist(藝術家)
圖中所有的對象都是artis,當圖形顯示時,所有的藝術家都會被繪製到畫布上。
- 基本上所有的對象都是一個Artist對象,包括Figure對象、Axes對象和Axis對象,可以將Artist理解爲一個基本類。
- 當提交代碼,圖像最終呈現時,所有的artist對象都會繪製於canvas畫布上
值得注意的是:
- 一個figure(圖)可以包含多個axes(座標系),但是一個axes只能屬於一個figure。
- 一個axes(座標系)可以包含多個axis(座標軸),包含兩個即爲2d座標系,3個即爲3d座標系
繪圖之間的層級結構如下:
3、繪圖步驟
在現實生活中,如果我們要畫一幅畫,首先需要什麼工具呢?
- 首先咱們需要一個畫板
- 其次還需要一張畫布
- 指定大致輪廓(軸),軸是繪畫的基準
- 最後是畫畫工具(畫筆…)
而使用 Matplotlib 畫圖同樣如此,首先需要指定一個畫板,再指定一張畫布,然後再指定元素開始作畫。
例如:
import matplotlib.pyplot as plt
# 指定一個畫板
fig = plt.figure()
# 指定畫板後指定軸
# ax = fig.add_subplot(111)
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(224)
ax4 = fig.add_subplot(223)
# 設置軸的位置
# ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes',
# ylabel='Y-Axis', xlabel='X-Axis')
plt.show()
運行結果如下:
3、matplotlib 重要模塊 pyplot 詳解
matplotlib.pytplot包含了一系列類似於matlab的畫圖函數。 它的函數作用於當前圖形(figure)的當前座標系(axes)。
3.1 導入模塊
import matplotlib.pyplot as plt
3.2 運用模塊
導入模塊後,調用相應函數,例如
plot(xdata,ydata,format)
函數參數:
- xdata:所有點的x座標,如果不傳默認是[0:]。
- ydata:所有點的y座標。
- format:繪製的格式,默認是’b-‘。比如’b-+’:分別代表顏色、線形和標記。
- 顏色:繪製的顏色(b指blue,藍色)。
- 線性:點之間的連線樣式(-指實線)。
- 標記:點的風格(+爲加號)。
例如:
import matplotlib.pyplot as plt
plt.plot([1,2],[1,2],'r--+')
plt.show()
運行結果爲:
再例如一個簡單的折線圖如下:
import matplotlib.pyplot as plt
x = (1,3,5,9,13)
y = (2,5,9,12,28)
# 調用繪製方法
# 設置線條屬性
# linewidth屬性設置線條的寬度
plt.plot(x,y,linewidth = 5)
# 顯示圖片
plt.show()
運行結果:
除了設置這些屬性以外,圖形還可以設置其他屬性,這些概念我們將在下一節文章中作詳細的講解。
總結
凡事預則立,學習任何一門知識也得從最基本開始,本章節對 matplotlib 模塊做了詳細的概念描述,在接下來的的章節中將結合 NumPy 模塊進行實戰性演練,以此對初入門的夥伴們做更好的支撐。
參考
https://blog.csdn.net/hekind/article/details/79542040
https://matplotlib.org/3.1.1/contents.html
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.html?highlight=matplotlib pyplot#module-matplotlib.pyplot
文中示例代碼:python-100-days
關注公衆號:python技術,回覆"python"一起學習交流