Matplotlib 繪製平滑曲線

Suraj Joshi 2023年1月30日
  1. 使用 scipy.interpolate.make_interp_spline() 類繪製平滑曲線
  2. 使用 scipy.ndimage.gaussian_filter1d() 類繪製平滑曲線
  3. 使用 scipy.interpolate.interp1d 類繪製平滑曲線
Matplotlib 繪製平滑曲線

本教程解釋瞭如何使用 ScipyMatplotlib 包中的模組從給定座標繪製一條平滑的曲線。

預設情況下,matplotlib.pyplot.plot() 函式是通過將資料中相鄰的兩個點用直線連線起來產生曲線,因此 matplotlib.pyplot.plot() 函式對於少量的資料點並不能產生平滑曲線。

為了繪製一條平滑曲線,我們首先要對曲線擬合一條曲線,並利用曲線找到 x 值對應的 y 值,並以無限小的空隙分開。最後,我們通過繪製那些間隙很小的點,得到一條平滑曲線。

使用 scipy.interpolate.make_interp_spline() 類繪製平滑曲線

import numpy as np
from scipy.interpolate import make_interp_spline
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5, 6, 7])
y = np.array([100, 50, 25, 12.5, 6.25, 3.125, 1.5625])

model = make_interp_spline(x, y)

xs = np.linspace(1, 7, 500)
ys = model(xs)

plt.plot(xs, ys)
plt.title("Smooth Spline Curve")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

輸出:

使用 make_interp_spline()函式繪製平滑曲線

它通過使用 scipy.interpolate.make_interp_spline() 首先確定花鍵曲線的係數,繪製出一條平滑的花鍵曲線。我們用給定的資料來估計花樣曲線的係數,然後用係數來確定間隔緊密的 x 值y 值,使曲線平滑。繪製曲線需要沿 X 軸 1 到 7 之間間隔相等的 500

預設情況下,花鍵曲線的度數是 3,我們可以設定 k 引數來改變花鍵曲線的度數。

如果我們使用給定的點來繪製曲線,我們得到的曲線為:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5, 6, 7])
y = np.array([100, 50, 25, 12.5, 6.25, 3.125, 1.5625])

plt.plot(x, y)
plt.title("Curve plotted using the given points")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

輸出:

使用給定點繪製的曲線

使用 scipy.ndimage.gaussian_filter1d() 類繪製平滑曲線

import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter1d

x = np.array([1, 2, 3, 4, 5, 6, 7])
y = np.array([100, 50, 25, 12.5, 6.25, 3.125, 1.5625])
y_smoothed = gaussian_filter1d(y, sigma=5)

plt.plot(x, y_smoothed)
plt.title("Spline Curve Using the Gaussian Smoothing")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

輸出:

使用 gaussian_filter1d()函式繪製平滑曲線

如果函式不平滑,我們可以使用 gaussian_filter1d() 來使 Y 值平滑。scipy.ndimage.gaussian_filter1d() 類會對 Y 值進行平滑處理,生成一條平滑的曲線,但是原來的 Y 值可能會被改變。

sigma 引數代表高斯核的標準差,增加 sigma 的值會得到更平滑的曲線。

使用 scipy.interpolate.interp1d 類繪製平滑曲線

import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5, 6, 7])
y = np.array([100, 50, 25, 12.5, 6.25, 3.125, 1.5625])

cubic_interploation_model = interp1d(x, y, kind="cubic")
xs = np.linspace(1, 7, 500)
ys = cubic_interploation_model(xs)

plt.plot(xs, ys)
plt.title("Spline Curve Using Cubic Interpolation")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

輸出:

用立方插值法繪製平滑曲線

它使用 scipy.interpolate.interp1d 類生成一條立方插值曲線,然後我們使用這條曲線來確定間距緊密的 x 值,從而得到一條平滑的曲線。繪製曲線時,需要在 X 軸上 1 和 7 之間取間隔相等的 500 個點。

作者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn