2. Matplotlib套件 (視覺化資料)
日期:2024/04/17
2. NumPy 套件 (視覺化資料)
Matplotlib 是 Python 中一個常用的繪圖庫,可以與 NumPy 一起用來繪製各種類型的圖表。在進行開始之前,請確認已經安裝了 Matplotlib。
2.1 中文字體
我們先去下載中文字體,推薦使用 Google Font Noto Sans Traditional Chinese。
import matplotlib as mplimport matplotlib.pyplot as pltfrom matplotlib.font_manager import fontManagerfontManager.addfont('字體路徑')mpl.rc('font', family='Noto Sans TC')
依照上述設定即可正常顯示中文,後續程式範例將省略此部分。
WINDOWS 作業系統路徑\需要跳脫字元如下:
fontManager.addfont('C:\\Users\\<username>\\OneDrive\\桌面\\Noto_Sans_TC\\static\\NotoSansTC-Regular.ttf')
2.2 折線圖
# 建立一些示例資料data = np.arange(10)# 繪製折線圖plt.plot(data)# 添加標題和標籤plt.title('示例折線圖')plt.xlabel('X 軸')plt.ylabel('Y 軸')

plt.plot(x, y):繪製 y 相對於 x 之圖表,如果省略 x,則 x 軸標籤為資料序數。
- x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- y = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2.3 曲線圖
單線
x = np.linspace(0, 10, 100) # 在 0 到 10 之間生成 100 個等間距的數字y = np.sin(x) # 計算正弦值# 繪製曲線圖plt.plot(x, y)# 添加標題和標籤plt.title('正弦曲線')plt.xlabel('x')plt.ylabel('sin(x)')

多線
x = np.linspace(0, 10, 100) # 在 0 到 10 之間生成 100 個等間距的數字y1 = np.sin(x) # 計算正弦值y2 = np.cos(x) # 計算餘弦值# 繪製曲線圖plt.plot(x, y1, label='sin(x)')plt.plot(x, y2, label='cos(x)')# 添加標題和圖例plt.title('正弦值 / 餘弦值')plt.legend(loc='best')

legend()如不傳入任何額外參數時,將自動決定要新增至圖例的元素。
| 位置字符串 | 位置代碼 | 位置字符串 | 位置代碼 |
|---|---|---|---|
'best' (僅限軸) | 0 | 'center left' | 6 |
'upper right' | 1 | 'center right' | 7 |
'upper left' | 2 | 'lower center' | 8 |
'lower left' | 3 | 'upper center' | 9 |
'lower right' | 4 | 'center' | 10 |
'right' | 5 |
2.4 線條樣式
plot() 函式也接受顏色與線條樣式,例如:
plt.plot(x, y, color='g', linestyle='--', marker='o') # 綠虛線圓圈標記
也可以不使用關鍵字參數,[color][marker][line]也支援其他組合,但請注意,它們的解析可能不正確。例如'go--'、'g--o' 皆可。
plt.plot(x, y, 'g--o') # 綠虛線圓圈標記

標記(Markers)
| 字符 | 描述 | 字符 | 描述 |
|---|---|---|---|
‘.’ | 點標記 | ‘,’ | 像素標記 |
‘o’ | 圓圈標記 | ‘v’ | 向下三角形標記 |
‘^’ | 向上三角形標記 | ‘<’ | 向左三角形標記 |
‘>’ | 向右三角形標記 | ‘1’ | 向下三角形標記 |
‘2’ | 向上三角形標記 | ‘3’ | 向左三角形標記 |
‘4’ | 向右三角形標記 | ‘8’ | 八邊形標記 |
‘s’ | 方形標記 | ‘p’ | 五邊形標記 |
‘P’ | 填充的加號標記 | ‘*’ | 星形標記 |
‘h’ | 六邊形1標記 | ‘H’ | 六邊形2標記 |
‘+’ | 加號標記 | ‘x’ | x標記 |
‘X’ | 填充的x標記 | ‘D’ | 菱形標記 |
‘d’ | 細菱形標記 | ‘|’ | 垂直線標記 |
‘_’ | 水平線標記 |
線條樣式(Line Styles)
| 字符 | 描述 | 字符 | 描述 |
|---|---|---|---|
'-' | 實線 | '-.' | 點虛線 |
'--' | 虛線 | ':' | 點線 |
顏色(Colors)
| 字符 | 顏色 | 字符 | 顏色 |
|---|---|---|---|
'b' | 藍色 | 'm' | 洋紅色 |
'g' | 綠色 | 'y' | 黃色 |
'r' | 紅色 | 'k' | 黑色 |
'c' | 青色 | 'w' | 白色 |
如果顏色是格式字串的唯一部分,您也可以使用任何matplotlib.colors規範,例如全名 ( 'green') 或十六進位字串 ( '#008000')。
2.4 長條圖/直方圖
# 準備數據categories = ['A', 'B', 'C', 'D', 'E']values = [23, 45, 56, 78, 33]# 繪製長條圖plt.bar(categories, values)# 添加標題和標籤plt.title('示例長條圖')plt.xlabel('Categories')plt.ylabel('Values')

將 bar() 改為 barh(),就會變成水平的長條圖。
# 準備數據categories = ['A', 'B', 'C', 'D', 'E']values = [23, 45, 56, 78, 33]# 繪製水平長條圖plt.barh(categories, values)# 添加標題和標籤plt.title('示例水平長條圖')plt.xlabel('Values')plt.ylabel('Frequency')

如果資料量很多時我們可以使用bins將數據分組,取最大值與最小值的差,再除以分組數量,即為每個分組的數值範圍。
# 生成隨機數據data = np.random.randn(1000)# 繪製直方圖plt.hist(data, bins=10)# 添加標題和標籤plt.title('示例分組直方圖')plt.xlabel('Values')plt.ylabel('Frequency')

有連續性的圖形才能省略 x
2.4 散布圖
散布圖
# 生成隨機數據data = np.random.randn(1000)# 繪製直方圖plt.hist(data, bins=10)# 添加標題和標籤plt.title('示例分組長條圖')plt.xlabel('Values')plt.ylabel('Frequency')

大小散布圖
# 生成隨機數據x = np.random.randn(30)y = np.random.randn(30)sizes = np.random.rand(30) * 1000# 繪製散布圖plt.scatter(x, y, s=sizes)# 添加標題和標籤plt.title('大小散布圖')plt.xlabel('X')plt.ylabel('Y')

散布圖
# 生成隨機數據x = np.random.randn(20)y = np.random.randn(20)sizes = np.random.rand(20) * 100colors = np.random.rand(20)# 繪製散布圖plt.scatter(x, y, s=sizes, c=colors, cmap='viridis')# 添加標題和標籤plt.title('顏色散布圖')plt.xlabel('X')plt.ylabel('Y')# 顯示顏色條plt.colorbar(label='色彩值')

2.5 圓餅圖
圓餅圖
# 數據labels = ['A', 'B', 'C', 'D']sizes = [15, 30, 45, 10]# 繪製圓餅圖plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140)# 添加標題plt.title('示例圓餅圖')# 顯示圖形plt.axis('equal') # 保證圓餅圖是正圓的

中空圓餅圖
我們可以透過 wedgeprops參數字典中設定width達成中空樣式
x = [1, 2, 3, 4, 5]plt.pie(x,labels=x,radius=1.5,wedgeprops={'linewidth': 3, 'edgecolor': 'w', 'width': 1})

radius:圓餅圖的直徑wedgeprops.linewidth: 區塊間的間格wedgeprops.edgecolor: 區塊間的顏色wedgeprops.width:圓餅餅皮厚度
2.6 等高線(輪廓)圖
在開始之前我用簡單的方式來解釋 Numpy 中的 meshgrid()。
假設你有兩個一維數組,分別代表 x 和 y 軸的坐標:
x = [1, 2, 3]y = [4, 5, 6]
如果你想要得到所有可能的 x 和 y 坐標的組合,你可以使用 meshgrid()。讓我們來看看 meshgrid() 的效果:
import numpy as npx = [1, 2, 3]y = [4, 5, 6]X, Y = np.meshgrid(x, y)print("X 矩陣:")print(X)print("Y 矩陣:")print(Y)# X 矩陣:# [[1 2 3]# [1 2 3]# [1 2 3]]# Y 矩陣:# [[4 4 4]# [5 5 5]# [6 6 6]]
現在,可以將 X 和 Y 中的每個值視為一對 x 和 y 坐標。例如,(1, 4)、(2, 4)、(3, 4) 分別是第一列的坐標點,而 (1, 5)、(2, 5)、(3, 5) 分別是第二列的坐標點,以此類推。
這就是 meshgrid() 的作用:它將兩個一維數組轉換為兩個二維矩陣,其中一個矩陣包含了所有可能的 x 坐標,另一個矩陣包含了所有可能的 y 坐標。
contour()
plt.contour(X, Y, Z, levels=10, cmap='viridis', linewidths=2)
X和Y是網格化的二維坐標矩陣。Z是與X和Y對應的二維數值矩陣,表示需要繪製等高線的數據。levels參數指定等高線的數量或值。可以是一個整數,表示等高線的數量,也可以是一個列表,表示特定的等高線值。cmap參數指定了等高線的顏色映射,控制等高線的顏色。linewidths參數指定了等高線的線寬。
# 定義 x 和 y 的數據範圍x = np.linspace(-3, 3, 3)y = np.linspace(-3, 3, 3)# 將 x 和 y 網格化X, Y = np.meshgrid(x, y)Z = np.array([[1, 0, 1],[2, 1, 1.5],[3, 1.5 ,2]])# 繪製輪廓圖plt.contour(X, Y, Z, levels=10, cmap='viridis', linewidths=2)# 標示坐標for i in range(len(x)):for j in range(len(y)):plt.text(x[i], y[j], f'({x[i]:.0f}, {y[j]:.0f})', fontsize=8)plt.colorbar(label='色彩值')

contourf()
# 定義 x 和 y 的數據範圍x = np.linspace(-3, 3, 3)y = np.linspace(-3, 3, 3)# 將 x 和 y 網格化X, Y = np.meshgrid(x, y)Z = np.array([[1, 0, 1],[2, 1, 1.5],[3, 1.5 ,2]])# 繪製輪廓圖plt.contourf(X, Y, Z, levels=10, cmap='viridis')# 標示坐標for i in range(len(x)):for j in range(len(y)):plt.text(x[i], y[j], f'({x[i]:.0f}, {y[j]:.0f})', fontsize=8)plt.colorbar(label='色彩值')

contour() 與 contourf() 一個爲線條一個爲填滿的色塊。
contour3D()
# 定義 x 和 y 的數據範圍x = np.linspace(-3, 3, 3)y = np.linspace(-3, 3, 3)# 將 x 和 y 網格化# 定義 x 和 y 的數據範圍x = np.linspace(-3, 3, 3)y = np.linspace(-3, 3, 3)# 將 x 和 y 網格化X, Y = np.meshgrid(x, y)Z = np.array([[1, 0, 1],[2, 1, 1.5],[3, 1.5 ,2]])fig = plt.figure()ax = plt.axes(projection='3d')ax.contour3D(X, Y, Z, 50, cmap='viridis')

2.7 等高線(輪廓)圖
# 創建一個新的圖形窗口fig = plt.figure()# 添加第一個子圖(2行2列,第1個位置)ax1 = fig.add_subplot(2, 2, 1)ax1.plot([1, 4, 3, 5, 2]) # 在第一個子圖中繪製折線圖# 添加第二個子圖(2行2列,第2個位置)ax2 = fig.add_subplot(2, 2, 2)ax2.scatter([1, 2, 3], [4, 5, 6]) # 在第二個子圖中繪製散點圖# 添加第三個子圖(2行2列,第3個位置)ax3 = fig.add_subplot(2, 2, 3)ax3.bar([1, 2, 3], [4, 5, 6]) # 在第三個子圖中繪製長條圖# 添加第四個子圖(2行2列,第4個位置)ax4 = fig.add_subplot(2, 2, 4)ax4.hist([1, 2, 2, 3, 3, 3, 3, 4, 4, 5]) # 在第四個子圖中繪製直方圖

