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.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()

出力:

make_interp_spline() 関数を使用して滑らかな曲線をプロットする

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() 関数を用いて滑らかな曲線をプロットする

関数が滑らかでない場合は、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
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn