Matplotlib 繪製平滑曲線

Suraj Joshi 2023年1月30日 2020年12月31日
  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 個點。

Author: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn