本章節(jié)主要是 Matplotlib 和 NumPy 實(shí)際操作案例講解,matplotlib 通常與 NumPy 一起使用,提供了一種有效的 MatLab 開(kāi)源替代方案,除此之外,它還可以和其他圖形工具包搭配使用。前提是在現(xiàn)在的環(huán)境中已經(jīng)安裝了 Numpy 模塊,Numpy 安裝詳情請(qǐng)參考第79天:數(shù)據(jù)分析之 Numpy 初步
這一節(jié)將從簡(jiǎn)到繁用實(shí)例講解 matplotlib 和 Numpy 結(jié)合使用的知識(shí)點(diǎn)。
使用 Numpy的函數(shù) np.arange()
函數(shù)創(chuàng)建 x 軸上的值。將 y 軸上的對(duì)應(yīng)值存儲(chǔ)在另一個(gè)數(shù)組對(duì)象 y 中。這些值使用 matplotlib 軟件包的 pyplot 子模塊的 plot() 函數(shù)繪制。
實(shí)例如下:
# 導(dǎo)入模塊
import numpy as np
import matplotlib.pyplot as plt
# 繪制 x 軸數(shù)據(jù)
x = np.arange(2,15)
y = 3 * x+6
# 給圖形設(shè)置標(biāo)題
plt.title('line chart')
# 設(shè)置 x 軸和 y 軸的屬性名
plt.xlabel("x axis")
plt.ylabel("y axis")
# 繪制圖形
plt.plot(x,y)
# 顯示圖形
plt.show()
以上程序運(yùn)行結(jié)果圖:
注意:作為線性圖的替代,可以通過(guò)向 plot() 函數(shù)添加格式字符串來(lái)顯示離散值,可以使用以下格式化字符,表格如下:
字符 | 描述 |
---|---|
'-' | 實(shí)線樣式 |
'--' | 短橫線樣式 |
'-.' | 點(diǎn)劃線樣式 |
':' | 虛線樣式 |
'.' | 點(diǎn)標(biāo)記 |
',' | 像素標(biāo)記 |
'o' | 圓標(biāo)記 |
'v' | 倒三角標(biāo)記 |
'^' | 正三角標(biāo)記 |
'<' | 左三角標(biāo)記 |
'>' | 右三角標(biāo)記 |
'1' | 下箭頭標(biāo)記 |
'2' | 上箭頭標(biāo)記 |
'3' | 左箭頭標(biāo)記 |
'4' | 右箭頭標(biāo)記 |
's' | 正方形標(biāo)記 |
'p' | 五邊形標(biāo)記 |
'*' | 星形標(biāo)記 |
'h' | 六邊形標(biāo)記 1 |
'H' | 六邊形標(biāo)記 2 |
'+' | 加號(hào)標(biāo)記 |
'x' | X 標(biāo)記 |
'D' | 菱形標(biāo)記 |
'd' | 窄菱形標(biāo)記 |
'|' | 豎直線標(biāo)記 |
'_' | 水平線標(biāo)記 |
圖形顯示顏色縮寫(xiě)簡(jiǎn)寫(xiě)表格如下:
字符 | 顏色 |
---|---|
'b' | 藍(lán)色 |
'g' | 綠色 |
'r' | 紅色 |
'c' | 青/綠色 |
'm' | 品紅色 |
'y' | 黃色 |
'k' | 黑色 |
'w' | 白色 |
'o' | 橙色 |
使用以上兩個(gè)表格表示的簡(jiǎn)化符號(hào)畫(huà)一個(gè)綠色散點(diǎn)圖,散點(diǎn)使用 'o'
表示,,具體實(shí)例如下:
# 導(dǎo)入模塊
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(2, 15)
y = 2 * x + 6
plt.title("scatter chart")
plt.xlabel("x axis")
plt.ylabel("y axis")
# 設(shè)置圖形樣式和顏色
plt.plot(x, y, "oc")
plt.show()
以上程序運(yùn)行結(jié)果為:
例如繪制一個(gè)倒三角圖形:
# 導(dǎo)入模塊
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(2, 15)
y = 2 * x + 6
plt.title("triangle_scatter chart")
plt.xlabel("x axis")
plt.ylabel("y axis")
# 設(shè)置圖形樣式和顏色
plt.plot(x, y, "^c")
plt.show()
顯示結(jié)果如下:
正弦波形圖的繪制需要用到 Numpy 的數(shù)學(xué)函數(shù) sin() 和 cos(),詳細(xì)的數(shù)學(xué)函數(shù)使用請(qǐng)參考 NumPy 系列文章:第 84 天:NumPy 數(shù)學(xué)函數(shù)
import numpy as np
import matplotlib.pyplot as plt
# 計(jì)算正弦曲線上點(diǎn)的 x 和 y 坐標(biāo)
print(np.pi)
# 繪制 x 軸,從 0 開(kāi)始,
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
# 設(shè)置標(biāo)題
plt.title("sine wave form")
# 繪制圖形點(diǎn)
plt.plot(x, y, 'y')
plt.show()
顯示結(jié)果:
import numpy as np
import matplotlib.pyplot as plt
# 計(jì)算正弦曲線上點(diǎn)的 x 和 y 坐標(biāo)
print(np.pi)
# 繪制 x 軸,從 0 開(kāi)始,
x = np.arange(0, 4 * np.pi, 0.1)
y = np.cos(x)
# 設(shè)置標(biāo)題
plt.title("cosine wave form")
# 繪制圖形點(diǎn)
plt.plot(x, y, 'm')
plt.show()
在一張圖中顯示出正弦函數(shù)和余弦函數(shù),這里需要使用 subplot 來(lái)建立網(wǎng)格圖,一幅圖中使用兩個(gè)網(wǎng)格,兩個(gè)網(wǎng)格中分別展示正弦函數(shù)和余弦函數(shù);subplot 函數(shù)使用說(shuō)明如下:
matplotlib 中, 一個(gè) Figure 對(duì)象可以包含多個(gè)子圖(Axes), 可以使用 subplot() 快速繪制, 調(diào)用形式如下 :
subplot(numRows, numCols, plotNum)
參數(shù)說(shuō)明:
網(wǎng)格編號(hào)圖如下:
假如 numRows = 2, numCols = 3, 那整個(gè)繪制圖表樣式為 2X3 的圖片區(qū)域, 用坐標(biāo)表示為
(1, 1), (1, 2), (1, 3)
(2, 1), (2, 2), (2, 3)
再當(dāng) plotNum = 3 時(shí), 表示的坐標(biāo)為(1, 3), 即第一行第三列的子圖 如果 numRows, numCols 和 plotNum 這三個(gè)數(shù)都小于 10 的話, 可以把它們縮寫(xiě)為一個(gè)整數(shù), 例如 subplot(323) 和 subplot(3,2,3) 是相同的。
subplot 在 plotNum 指定的區(qū)域中創(chuàng)建一個(gè)軸對(duì)象, 如果新創(chuàng)建的軸和之前創(chuàng)建的軸重疊的話,之前的軸將被刪除。
例1:上述網(wǎng)格編號(hào)圖代碼如下
import matplotlib.pyplot as plt
plt.subplot(2,2,1)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,1)',ha='center',va='center',size=20,alpha=.5)
plt.subplot(2,2,2)
plt.xticks([]),plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,2)',ha='center',va='center',size=20,alpha=.5)
plt.subplot(2,2,3)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,3)',ha='center',va='center',size=20,alpha=.5)
plt.subplot(2,2,4)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,4)',ha='center',va='center',size=20,alpha=.5)
plt.show()
例4:
import matplotlib.pyplot as plt
plt.subplot(211) # 第一行的左圖
plt.subplot(212) # 第一行的右圖
plt.show()
還可以表示為:
import matplotlib.pyplot as plt
plt.subplot(2,1,1)
#設(shè)置 x 和 y 軸上的值
plt.xticks([]), plt.yticks([]) # 表示無(wú)顯示值
plt.text(0.5,0.5, 'subplot(2,1,1)',ha='center',va='center',size=24,alpha=.5)
plt.subplot(2,1,2)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,1,2)',ha='center',va='center',size=24,alpha=.5)
plt.show()
結(jié)果顯示:
網(wǎng)格圖1:
網(wǎng)格圖2:
所以正余弦函數(shù)波形圖可以表示為:
# 計(jì)算正弦和余弦曲線上的點(diǎn)的 x 和 y 坐標(biāo)
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 建立 subplot 網(wǎng)格,高為 2,寬為 1
# 激活第一個(gè) subplot
plt.subplot(2, 1, 1)
# 繪制第一個(gè)圖像
plt.plot(x, y_sin)
plt.title('Sine')
# 將第二個(gè) subplot 激活,并繪制第二個(gè)圖像
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title('Cosine')
# 展示圖像
plt.show()
最后圖形展示:
直方圖也稱條形圖,pyplot 子模塊提供 bar() 函數(shù)來(lái)生成條形圖,下面的實(shí)例是一個(gè)使用 bar()
函數(shù)生成的一個(gè)簡(jiǎn)單的柱狀圖.
實(shí)例如下:
import matplotlib.pyplot as plt
# 設(shè)置 x 的 x 軸和 y 軸數(shù)值
x = [5,8,10]
y = [12,16,6]
# 設(shè)置 x2 的 x 軸和 y 軸數(shù)值
x2 = [6,9,11]
y2 = [6,15,7]
# 使用 bar() 函數(shù)設(shè)置條形圖的顏色和對(duì)齊方式
plt.bar(x, y,color='y', align='center')
plt.bar(x2, y2, color='c', align='center')
# 設(shè)置標(biāo)題
plt.title('Bar chart')
# 設(shè)置 x 軸和 y 軸的屬性名
plt.ylabel('Y axis')
plt.xlabel('X axis')
# 展示圖形
plt.show()
程序運(yùn)行結(jié)果為:
Matplotlib 結(jié)合 NumPy 使用:
這時(shí)候需要用到 NumPy 中的直方統(tǒng)計(jì)函圖:histogram
histogram(a,bins=10,range=None,weights=None,density=False);
參數(shù)說(shuō)明:
a
是待統(tǒng)計(jì)數(shù)據(jù)的數(shù)組;bins
指定統(tǒng)計(jì)的區(qū)間個(gè)數(shù);range
是一個(gè)長(zhǎng)度為2的元組,表示統(tǒng)計(jì)范圍的最小值和最大值,默認(rèn)值 None
,表示范圍由數(shù)據(jù)的范圍決定weights
為數(shù)組的每個(gè)元素指定了權(quán)值,histogram()
會(huì)對(duì)區(qū)間中數(shù)組所對(duì)應(yīng)的權(quán)值進(jìn)行求和density
為 True
時(shí),返回每個(gè)區(qū)間的概率密度;為 False
,返回每個(gè)區(qū)間中元素的個(gè)數(shù)函數(shù)說(shuō)明:
numpy.histogram()
函數(shù)是數(shù)據(jù)的頻率分布的圖形表示。水平尺寸相等的矩形對(duì)應(yīng)于類間隔,稱為 bin,變量 height 對(duì)應(yīng)于頻率。numpy.histogram()
函數(shù)將輸入數(shù)組和 bin 作為兩個(gè)參數(shù)。bin 數(shù)組中的連續(xù)元素用作每個(gè) bin 的邊界。例如:
import numpy as np
# 賦值數(shù)組 a
a = np.array([22, 87, 5, 43, 56, 73, 55, 54, 11, 20, 51, 5, 79, 31, 27])
# 調(diào)用函數(shù)
np.histogram(a, bins=[0, 20, 40, 60, 80, 100])
hist, bins = np.histogram(a, bins=[0, 20, 40, 60, 80, 100])
# 輸出值
print(hist)
print(bins)
輸出結(jié)果為:
[3 4 5 2 1]
[ 0 20 40 60 80 100]
plt()
函數(shù)使用:
Matplotlib 可以將直方圖的數(shù)字表示轉(zhuǎn)換為圖形。pyplot 子模塊的 plt() 函數(shù)將包含數(shù)據(jù)和 bin 數(shù)組的數(shù)組作為參數(shù),并轉(zhuǎn)換為直方圖,例如:
import numpy as np
import matplotlib.pyplot as plt
# 賦值數(shù)組 a
a = np.array([22, 87, 43, 56, 73, 55, 11, 20, 51, 5, 79, 27,100])
# plt() 函數(shù)將數(shù)據(jù)變?yōu)橹狈綀D
plt.hist(a, bins=[0,20,40,60,80,100])
plt.title("histogram")
# 顯示圖形
plt.show()
顯示結(jié)果:
例1:一個(gè)簡(jiǎn)單的曲線圖
畫(huà)出一個(gè)簡(jiǎn)單的曲線圖,如下所示:
import matplotlib.pyplot as plt
import numpy as np
n = 256
X = np.linspace(-np.pi,np.pi,n,endpoint=True)
Y = np.sin(2*X)
plt.plot (X, Y+1, color='blue', alpha=1.00)
plt.plot (X, Y-1, color='blue', alpha=1.00)
plt.title('curve_chart1')
plt.show()
結(jié)果展示為:
例2:升級(jí)版的曲線圖
import numpy as np
import matplotlib.pyplot as plt
n = 256
X = np.linspace(-np.pi,np.pi,n,endpoint=True)
Y = np.sin(2*X)
plt.plot (X, Y+1, color='blue', alpha=1.00)
plt.fill_between(X, 1, Y+1, color='blue', alpha=.25)
plt.plot (X, Y-1, color='blue', alpha=1.00)
# 設(shè)置線條顏色和填充顏色區(qū)域
plt.fill_between(X, -1, Y-1, (Y-1) > -1, color='blue', alpha=.25)
plt.fill_between(X, -1, Y-1, (Y-1) < -1, color='red', alpha=.25)
plt.title('curve_chart2')
plt.show()
結(jié)果展示為:
本章節(jié)是 Matplotlib 結(jié)合 NumPy 使用的畫(huà)圖方法,主要介紹了折線圖、正余弦波形圖、方形圖、曲線圖的基本畫(huà)法,同時(shí)也詳細(xì)講述了子圖 subplot
的基本使用方法,希望以上知識(shí)點(diǎn)能對(duì)學(xué)習(xí)這一模塊的伙伴們提供更好支撐,若有任何問(wèn)題歡迎在交流群中進(jìn)行交流 :)
https://www.runoob.com/numpy/numpy-matplotlib.html
https://www.runoob.com/w3cnote/matplotlib-tutorial.html
https://matplotlib.org/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py
文中示例代碼:https://github.com/JustDoPython/python-100-day
系列文章
聯(lián)系客服