第92天:Python Matplotlib 進階操作

by 潮汐

本章節主要是 Matplotlib 和 NumPy 實際操作案例講解,matplotlib 通常與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案,除此之外,它還可以和其他圖形工具包搭配使用。前提是在現在的環境中已經安裝了 Numpy 模塊,Numpy 安裝詳情請參考第 79 天:數據分析之 Numpy 初步

這一節將從簡到繁用實例講解 matplotlib 和 Numpy 結合使用的知識點。

1、折線圖

使用 Numpy的函數 np.arange() 函數創建 x 軸上的值。將 y 軸上的對應值存儲在另一個數組對象 y 中。 這些值使用 matplotlib 軟件包的 pyplot 子模塊的 plot() 函數繪製。

實例如下:

# 導入模塊
import numpy as np
import matplotlib.pyplot as plt

# 繪製 x 軸數據
x = np.arange(2,15)
y = 3 * x+6

# 給圖形設置標題
plt.title('line chart')
# 設置 x 軸和 y 軸的屬性名
plt.xlabel("x axis")
plt.ylabel("y axis")

# 繪製圖形
plt.plot(x,y)

# 顯示圖形
plt.show()

以上程序運行結果圖:

折線圖

注意:作爲線性圖的替代,可以通過向 plot() 函數添加格式字符串來顯示離散值,可以使用以下格式化字符,表格如下:

字符 描述
'-' 實線樣式
'--' 短橫線樣式
'-.' 點劃線樣式
':' 虛線樣式
'.' 點標記
',' 像素標記
'o' 圓標記
'v' 倒三角標記
'^' 正三角標記
'<' 左三角標記
'>' 右三角標記
'1' 下箭頭標記
'2' 上箭頭標記
'3' 左箭頭標記
'4' 右箭頭標記
's' 正方形標記
'p' 五邊形標記
'*' 星形標記
'h' 六邊形標記 1
'H' 六邊形標記 2
'+' 加號標記
'x' X 標記
'D' 菱形標記
'd' 窄菱形標記
'|' 豎直線標記
'_' 水平線標記

圖形顯示顏色縮寫簡寫表格如下:

字符 顏色
'b' 藍色
'g' 綠色
'r' 紅色
'c' 青/綠色
'm' 品紅色
'y' 黃色
'k' 黑色
'w' 白色
'o' 橙色

2、散點圖

使用以上兩個表格表示的簡化符號畫一個綠色散點圖,散點使用 '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")

# 設置圖形樣式和顏色
plt.plot(x, y, "oc")
plt.show()

以上程序運行結果爲:

散點圖

例如繪製一個倒三角圖形:

# 導入模塊
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")

# 設置圖形樣式和顏色
plt.plot(x, y, "^c")
plt.show()

顯示結果如下:

倒三角性散點圖

3、正餘弦波形圖

正弦波形圖

正弦波形圖的繪製需要用到 Numpy 的數學函數 sin() 和 cos(),詳細的數學函數使用請參考 NumPy 系列文章:第 84 天:NumPy 數學函數

import numpy as np
import matplotlib.pyplot as plt

# 計算正弦曲線上點的 x 和 y 座標
print(np.pi)

# 繪製 x 軸,從 0 開始,
x = np.arange(0, 3 * np.pi,  0.1)
y = np.sin(x)

# 設置標題
plt.title("sine wave form")

# 繪製圖形點
plt.plot(x, y, 'y')
plt.show()

顯示結果:

正弦波形圖

餘弦波形圖

import numpy as np
import matplotlib.pyplot as plt

# 計算正弦曲線上點的 x 和 y 座標
print(np.pi)

# 繪製 x 軸,從 0 開始,
x = np.arange(0, 4 * np.pi,  0.1)
y = np.cos(x)

# 設置標題
plt.title("cosine wave form")

# 繪製圖形點
plt.plot(x, y, 'm')
plt.show()

餘弦波形圖

正餘弦波形圖

在一張圖中顯示出正弦函數和餘弦函數,這裏需要使用 subplot 來建立網格圖,一幅圖中使用兩個網格,兩個網格中分別展示正弦函數和餘弦函數;subplot 函數使用說明如下:

matplotlib 中, 一個 Figure 對象可以包含多個子圖(Axes), 可以使用 subplot() 快速繪製, 調用形式如下 :

subplot(numRows, numCols, plotNum)

參數說明:

  • 圖表的整個繪圖區域被分成 numRows 行和 numCols 列
  • 然後按照從左到右,從上到下的順序對每個子區域進行編號,左上的子區域的編號爲1,左下子區域編號爲3,右上子區域編號爲2,右下子區域編號爲 4,當然具體的還要看指定網格的行數和列數而定。
  • plotNum 參數指定創建的 Axes 對象所在的區域

網格編號圖如下:

網格編號圖

假如 numRows = 2, numCols = 3, 那整個繪製圖表樣式爲 2X3 的圖片區域, 用座標表示爲

(1, 1), (1, 2), (1, 3)
(2, 1), (2, 2), (2, 3)

再當 plotNum = 3 時, 表示的座標爲(1, 3), 即第一行第三列的子圖
如果 numRows, numCols 和 plotNum 這三個數都小於 10 的話, 可以把它們縮寫爲一個整數, 例如 subplot(323) 和 subplot(3,2,3) 是相同的。

subplot 在 plotNum 指定的區域中創建一個軸對象, 如果新創建的軸和之前創建的軸重疊的話,之前的軸將被刪除。

例1:上述網格編號圖代碼如下

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)
#設置 x 和 y 軸上的值
plt.xticks([]), plt.yticks([]) # 表示無顯示值
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()

結果顯示:

網格圖1:
網格圖1

網格圖2:

網格圖2

所以正餘弦函數波形圖可以表示爲:


# 計算正弦和餘弦曲線上的點的 x 和 y 座標
x = np.arange(0,  3  * np.pi,  0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)

# 建立 subplot 網格,高爲 2,寬爲 1
# 激活第一個 subplot
plt.subplot(2,  1,  1)
# 繪製第一個圖像
plt.plot(x, y_sin)
plt.title('Sine')

# 將第二個 subplot 激活,並繪製第二個圖像
plt.subplot(2,  1,  2)
plt.plot(x, y_cos)
plt.title('Cosine')

# 展示圖像
plt.show()

最後圖形展示:

正餘弦波形圖

4、直方圖

直方圖也稱條形圖,pyplot 子模塊提供 bar() 函數來生成條形圖,下面的實例是一個使用 bar() 函數生成的一個簡單的柱狀圖.
實例如下:

import matplotlib.pyplot as plt

# 設置 x 的 x 軸和 y 軸數值
x = [5,8,10]
y = [12,16,6]

# 設置 x2 的 x 軸和 y 軸數值
x2 = [6,9,11]
y2 = [6,15,7]

# 使用 bar() 函數設置條形圖的顏色和對齊方式
plt.bar(x, y,color='y', align='center')
plt.bar(x2, y2, color='c', align='center')

# 設置標題
plt.title('Bar chart')
# 設置 x 軸和 y 軸的屬性名
plt.ylabel('Y axis')
plt.xlabel('X axis')

# 展示圖形
plt.show()

程序運行結果爲:

直方圖

Matplotlib 結合 NumPy 使用:

這時候需要用到 NumPy 中的直方統計函圖:histogram

histogram(a,bins=10,range=None,weights=None,density=False);

參數說明:

  • a 是待統計數據的數組;
  • bins指定統計的區間個數;
  • range是一個長度爲2的元組,表示統計範圍的最小值和最大值,默認值 None,表示範圍由數據的範圍決定
  • weights爲數組的每個元素指定了權值,histogram()會對區間中數組所對應的權值進行求和
  • densityTrue 時,返回每個區間的概率密度;爲 False,返回每個區間中元素的個數

函數說明:

  • numpy.histogram() 函數是數據的頻率分佈的圖形表示。 水平尺寸相等的矩形對應於類間隔,稱爲 bin,變量 height 對應於頻率。
  • numpy.histogram() 函數將輸入數組和 bin 作爲兩個參數。 bin 數組中的連續元素用作每個 bin 的邊界。

例如:

import numpy as np

# 賦值數組 a
a = np.array([22, 87, 5, 43, 56, 73, 55, 54, 11, 20, 51, 5, 79, 31, 27])

# 調用函數
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)

輸出結果爲:

[3 4 5 2 1]
[  0  20  40  60  80 100]

plt()函數使用:

Matplotlib 可以將直方圖的數字表示轉換爲圖形。 pyplot 子模塊的 plt() 函數將包含數據和 bin 數組的數組作爲參數,並轉換爲直方圖,例如:

import numpy as np
import matplotlib.pyplot as plt

# 賦值數組 a
a = np.array([22, 87, 43, 56, 73, 55, 11, 20, 51, 5, 79, 27,100])

# plt() 函數將數據變爲直方圖
plt.hist(a, bins=[0,20,40,60,80,100])
plt.title("histogram")
# 顯示圖形
plt.show()

顯示結果:

直方圖

5、曲線圖

例1:一個簡單的曲線圖

畫出一個簡單的曲線圖,如下所示:

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

結果展示爲:

曲線圖1

例2:升級版的曲線圖

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)

# 設置線條顏色和填充顏色區域
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()

結果展示爲:

曲線圖2

總結

本章節是 Matplotlib 結合 NumPy 使用的畫圖方法,主要介紹了折線圖、正餘弦波形圖、方形圖、曲線圖的基本畫法,同時也詳細講述了子圖 subplot的基本使用方法,希望以上知識點能對學習這一模塊的夥伴們提供更好支撐,若有任何問題歡迎在交流羣中進行交流 😃

參考

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

文中示例代碼:python-100-days

關注公衆號:python技術,回覆"python"一起學習交流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章