Matplotlib 滑らかな曲線をプロット
-
scipy.interpolate.make_interp_spline()
クラスを用いた滑らかな曲線のプロット -
scipy.ndimage.gaussian_filter1d()を用いた滑らかな曲線のプロット
クラス -
scipy.interpolate.interp1d
クラスを用いた滑らかな曲線のプロット
このチュートリアルでは、Scipy
と Matplotlib
パッケージのモジュールを使って、与えられた座標から滑らかな曲線を描く方法を説明します。
関数 matplotlib.pyplot.plot.plot()
はデフォルトでは、データ中の隣接する 2つの点を直線で結合して曲線を生成します。
滑らかな曲線を描画するには、まずスプライン曲線を曲線にフィットさせ、その曲線を用いて、無限に小さなギャップで区切られた 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()
を用いてスプライン曲線の係数を求め、滑らかなスプライン曲線をプロットします。与えられたデータを用いてスプライン曲線の係数を推定し、その係数を用いて滑らかな曲線を作るための y-値
を x-値
の間隔が近いものに決定します。曲線をプロットするには、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-値
の間隔が近い場合の y-値
を決定します。曲線をプロットするには、X 軸に沿って 1 と 7 の間に等間隔に配置された 500 点の点が必要です。
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn