Python之Matplotlib數據可視化(二):密度圖與等高線圖

有時在二維圖上用等高線圖或者彩色圖來表示三維數據是個不錯的方法。Matplotlib 提供了三個函數來解決這個問題:
plt.contour 畫等高線圖、用 plt.contourf 畫帶有填充色的等高線圖(filled contour plot)的色彩、用 plt.imshow 顯示圖形

導入畫圖需要用的函數:

import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np

用等高線圖可視化三維數據

首先用函數 z = f (x, y) 演示一個等高線圖,按照下面的方式生成函數 f 樣本數據:

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');
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np

def f(x, y):
    return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

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');
plt.show()

在這裏插入圖片描述

用彩色等高線可視化三維數據

需要注意的是,當圖形中只使用一種顏色時,默認使用虛線表示負數,使用實線表示正數。另外,你可以用 cmap 參數設置一個線條配色方案來自定義顏色。還可以讓更多的線條顯示不同的顏色——可以將數據範圍等分爲 20 份,然後用不同的顏色表示:

plt.contour(X, Y, Z, 20, cmap='RdGy');
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np

def f(x, y):
    return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

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, 20, cmap='RdGy');
plt.show()

在這裏插入圖片描述
現在使用 RdGy (紅 - 灰,Red-Gray 的縮寫)配色方案,這對於數據集中度的顯示效果比較好。Matplotlib 有非常豐富的配色方案,可以在 IPython 裏用 Tab 鍵瀏覽 plt.cm 模塊對應的信息:

plt.cm.<TAB>

帶填充色的三維數據可視化圖

雖然上面那幅圖看起來漂亮多了,但是線條之間的間隙還是有點大 。我們可以通過 plt.contourf()函數來填充等高線圖(需要注意結尾有字母 f ),它的語法和 plt.contour() 是一樣的。
另外還可以通過 plt.colorbar() 命令自動創建一個表示圖形各種顏色對應標籤信息的顏色條:

plt.contourf(X, Y, Z, 20, cmap='RdGy')
plt.colorbar();
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np

def f(x, y):
    return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
plt.contourf(X, Y, Z, 20, cmap='RdGy')
plt.colorbar();
plt.show()

在這裏插入圖片描述
通過顏色條可以清晰地看出,黑色區域是“波峯”(peak),紅色區域是“波谷”(valley)。但是圖形還有一點不盡如人意的地方,就是看起來有點兒“污漬斑斑”,不是那麼幹淨。

重新渲染三維數據的彩色圖

這是由於顏色的改變是一個離散而非連續的過程,這並不是我們想要的效果。你當然可以通過將等高線的數量設置得非常多來解決這個問題,但是最終獲得的圖形性能會很不好,因爲 Matplotlib 必須渲染每一級的等高線。其實有更好的做法,那就是通過 plt.imshow()函數來處理,它可以將二維數組渲染成漸變圖。

plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower', cmap='RdGy')
plt.colorbar()
plt.axis(aspect='image');
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np

def f(x, y):
    return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower',cmap='RdGy')
plt.colorbar()
plt.axis(aspect='image');
plt.show()

在這裏插入圖片描述
但是,使用 imshow() 函數時有一些注意事項。
• plt.imshow() 不支持用 x 軸和 y 軸數據設置網格,而是必須通過 extent 參數設置圖形的座標範圍 [xmin, xmax, ymin, ymax]
• plt.imshow() 默認使用標準的圖形數組定義,就是原點位於左上角(瀏覽器都是如此),而不是絕大多數等高線圖中使用的左下角。這一點在顯示網格數據圖形的時候必須調整。
• plt.imshow() 會 自 動 調 整 坐 標 軸 的 精 度 以 適 應 數 據 顯 示。 你 可 以 通 過 plt.axis(aspect='image') 來設置 x 軸與 y 軸的單位。

在彩色圖上加上帶數據標籤的等高線

最後還有一個可能會用到的方法,就是將等高線圖與彩色圖組合起來。例如,如果我們想創建以下圖的效果,就需要用一幅背景色半透明的彩色圖(可以通過 alpha 參數設置透明度),與另一幅座標軸相同、帶數據標籤的等高線圖疊放在一起(用 plt.clabel() 函數實現):

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();
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np

def f(x, y):
    return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
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();
plt.show()

在這裏插入圖片描述
plt.contourplt.contourfplt.imshow 這三個函數組合起來之後,就打開了用二維圖畫三維數據的無盡可能。

備註

各位老鐵來個“關注”、“點贊”、“評論”三連擊哦
各位老鐵來個“關注”、“點贊”、“評論”三連擊哦
各位老鐵來個“關注”、“點贊”、“評論”三連擊哦

在這裏插入圖片描述

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