天天看點

淺析網格資料np.meshgrid()及等高線plt.contour()原理

在做支援向量機決策邊界繪制時,或多或少都會遇到這兩個問題。

1.當我們将兩個一維數組傳入np.meshgrid()後,它的内部是怎麼實作的?

2.當我們準備好的資料放入plt.contour()後,他是如何繪制等高線的?

在這過程中我們用到兩個包:

import matplotlib.pyplot as plt
import numpy as np
           

準備資料:

x = np.linspace(-2, 2, 5)
y = np.linspace(-2, 2, 5)
X, Y = np.meshgrid(x, y)
Z = X**2 + Y**2 - 1
           

接下來我們看一下,np.meshgrid()将我們的x, y轉成什麼樣的網格了。

資料如下:

x: [-2. -1. 0. 1. 2.]

y: [-2. -1. 0. 1. 2.]

網格資料X.shape為(5, 5),資料内容如下:

[[-2. -1. 0. 1. 2.]

[-2. -1. 0. 1. 2.]

[-2. -1. 0. 1. 2.]

[-2. -1. 0. 1. 2.]

[-2. -1. 0. 1. 2.]]

網格資料Y.shape為(5, 5),資料内容如下:

[[-2. -2. -2. -2. -2.]

[-1. -1. -1. -1. -1.]

[ 0. 0. 0. 0. 0.]

[ 1. 1. 1. 1. 1.]

[ 2. 2. 2. 2. 2.]]

通過觀察我們發下,經過X, Y = np.meshgrid(x, y)操作,它将我們的x資料縱向複制了5份,而将Y 轉置之後橫向複制了5份。那麼它複制的個數5是按照自己的長度呢?還是另一個坐标的數結構呢?通過下面例子可知:

x = [1, 2]

y = [3, 4, 5]

X, Y = np.meshgrid(x, y)

print(X)

print(Y)

控制台輸出:

[[1 2]

[1 2]

[1 2]]

[[3 3]

[4 4]

[5 5]]

另一個問題,這樣做是什麼原理?既然說np.meshgrid()做出來的資料是網格資料,那麼我們将X, Y 繪制出來看看:

plt.figure(figsize=(6, 4))
ax1 = plt.gca()
ax2 = plt.gca()
ax1.vlines(x=X, ymin=Y[0], ymax=Y[4], colors='r', linestyles='-.', linewidth=0.5)
ax2.hlines(y=X, xmin=Y[0], xmax=Y[4], colors='g', linestyles='-.', linewidth=0.5)

plt.scatter(X, Y)
           

我們分别單獨觀察X,Y以及X,Y的組合圖:

淺析網格資料np.meshgrid()及等高線plt.contour()原理

上圖即是x: [-2. -1. 0. 1. 2.]資料縱向複制5份的效果即為X。

淺析網格資料np.meshgrid()及等高線plt.contour()原理

上圖即是y: [-2. -1. 0. 1. 2.]資料轉置後橫向複制5份的效果即為Y。

下面是X, Y 的組合效果:

淺析網格資料np.meshgrid()及等高線plt.contour()原理

我們發下,np.meshgrid()真的将我們的x, y資料做成了網格。而X, Y矩陣對應位置的資料就是圖中相應位置點的坐标。而且,網格形狀也是(5 x 5)。

接下來我們談談等高線。什麼是等高線:把地面上海拔高度相同的點連成的閉合曲線,并垂直投影到一個水準面上,并按比例縮繪在圖紙上,就得到等高線。一句話說就是再一個平面上将使得Z = f(x, y)的Z值相等的衆多坐标點(注意:不止一個坐标點,這一點後邊會有所展現。)相連即為高度值為Z的等高線。

OK,上述生成的網格那麼優美,我們必須得搭配一個更優美的曲線x^2 + y^2= 1 來做我們的等高線喽。即Z = f(x, y) = x^2 + y^2 - 1。

将我們的X, Y帶入f(X, Y)得到Z形式也是(5x5),資料如下:

[[ 7. 4. 3. 4. 7.]

[ 4. 1. 0. 1. 4.]

[ 3. 0. -1. 0. 3.]

[ 4. 1. 0. 1. 4.]

[ 7. 4. 3. 4. 7.]]

如果仔細觀察,你會發現Z的形狀與X,Y的形狀相同,更更更重要的是,Z的形狀與我們的網格圖相對應(不是噎住了, 為了強調這種對應關系對生成等高線的重要性)!

接下來呢?上代碼+圖,生成我們的等高線:

ax = plt.gca()
cor = ax.contour(X, Y, Z, [-1, 0, 1, 3])
plt.clabel(cor, fontsize=10)
plt.show()
           

生成圖:

淺析網格資料np.meshgrid()及等高線plt.contour()原理

最後,但不是最不重要的是:我們指出讓在 [-1, 0, 1, 3]四個等高線上下标簽,但是-1沒有被寫出來???

如果我們隻寫[-1],會出現如下警告:

UserWarning: No contour levels were found within the data range.

cor = ax.contour(X, Y, Z, [-1])

此處,與前面某處呼應,即隻有不止一個點帶入f(x, y)中有相同值時,等高線才産生!

OK,Class is over.