Matplotlib 繪製平滑曲線
-
使用
scipy.interpolate.make_interp_spline()
類繪製平滑曲線 -
使用
scipy.ndimage.gaussian_filter1d()
類繪製平滑曲線 -
使用
scipy.interpolate.interp1d
類繪製平滑曲線
本教程解釋瞭如何使用 Scipy
和 Matplotlib
包中的模組從給定座標繪製一條平滑的曲線。
預設情況下,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()
輸出:
它通過使用 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()
來使 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 is a backend software engineer at Matrice.ai.
LinkedIn