文章目錄
[ Matplotlib version: 3.2.1 ]
六、密度圖與等高線圖
在二維圖上用等高線圖或者彩色圖來表示三維數據是個不錯的方法。
Matplotlib提供三個函數來解決這個問題:
- 用
plt.contour
畫等高線圖 - 用
plt.contourf
畫帶有填充色的等高線圖(filled contour plot)的色彩 - 用
plt.imshow
顯示圖形
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np
三維函數的可視化
1. 用等高線圖可視化三維數據
# 首先用函數z=f(x,y)演示一個等高線圖
def f(x, y):
return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
等高線圖可以用plt.contour
函數來創建。它需要三個參數:x軸、y軸、z軸三個座標軸的網格數據。x軸與y軸表示圖形中的位置,而z軸將通過等高線的等級來表示。
用np.meshgrid
函數準備數據是最簡單的方法,它可以從一維數組構建二維網格數據
x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
# 生成等高線圖
plt.contour(X, Y ,Z, colors='black')
- 當圖形中只使用一種顏色時,默認使用虛線表示負數,使用實線表示整數。
2. 用彩色等高線可視化三維數據
可以用cmap
參數設置一個線條配色方案自定義顏色,還可以讓更多的線條顯示不同的顏色(plt.cm
+Tab查看更多顏色)
# 可以將數據範圍等分爲20份,並用不同顏色表示
plt.contour(X, Y, Z, 20, cmap='RdGy')
- 使用RdGy(紅-灰,Red-Gray縮寫)配色方案,對數據集中度的顯示效果比較好
- 不足:線條之間的間隙還是有點大,可以通過
plt.contourf()
函數來填充等高線圖
3. 帶填充色的三維數據可視化
plt.contourf(X, Y, Z, 20, cmap='RdGy')
plt.colorbar()
- 通過顏色條可以清晰地看出,黑色區域是“波峯”(peak),紅色區域是“波谷”(valley)
- 不足:顏色看起來不自然(由於顏色的改變是一個離散而非連續的過程)
- 可以通過
plt.imshow()
函數來處理,將二維數組渲染成漸變圖
4. 重新渲染三維數據彩色圖
plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower', cmap='RdGy')
plt.colorbar()
plt.axis(aspect='image')
函數plt.imshow()
:
plt.imshow()
不支持用x軸和y軸數據設置網格,而是必須通過extent
參數設置圖形的座標範圍[xmin, xmax, ymin, ymax]
plt.imshow()
默認使用標準的圖形數組定義,就是原點位於左上角,而不是絕大多數等高線圖中使用的左下角,這一點在顯示網格數據圖形的時候必須調整plt.imshow()
會自動調整座標軸的精度以使用數據顯示,可以通過axis(aspect='image')
來設置x軸與y軸的單位
5. 在彩色圖上加上帶數據標籤的等高線
contours = plt.contour(X, Y, Z, 3, colors='black')
plt.clabel(contours, inline=True, fontsize=8)
plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower', cmap='RdGy', alpha=0.5)
plt.colorbar()
- 將等高線圖與彩色圖組合起來,需要用衣服背景色半透明的彩色圖(通過
alpha
參數設置透明度) - 與另一幅座標軸相同、帶數據標籤的等高線圖疊放在一起(
plt.clabel()
函數實現)
Matplotlib 相關閱讀:
[Python3] Matplotlib —— (一) 入門基礎
[Python3] Matplotlib —— (二) 簡易線形圖
[Python3] Matplotlib —— (三) 簡易散點圖
[Python3] Matplotlib —— (四) 可視化異常處理
總結自《Python數據科學手冊》