Python
 Computer >> コンピューター >  >> プログラミング >> Python

matplotlibで滑らかな曲線をプロットする方法!Bスプライン補間の使い方を解説

matplotlibでデータポイントをそのまま結んでプロットすると、折れ線グラフになりギザギザとした見た目になってしまいます。そこで活躍するのが、SciPyのinterpolate.make_interp_spline()を使ったBスプライン補間です。この記事では、少数のデータポイントから滑らかな曲線を描く方法を、手順とサンプルコード付きでわかりやすく解説します。

滑らかな線を描く手順

  1. 図のサイズを設定し、サブプロット周辺の余白を調整します。
  2. データポイントとなる配列xyを作成します。
  3. xyのデータポイントをプロットします。
  4. 滑らかな線を描くために、細かい点列x_newとBスプライン(bspline)を作成します。
  5. Bスプラインにx_newを渡して、補間後のy_newを計算します。
  6. plot()メソッドでx_newy_newをプロットします。
  7. show()メソッドで図を表示します。

コード例

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

# 図のサイズを設定
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

# x と y のデータポイント
x = np.array([1, 3, 4, 6, 7])
y = np.array([5, 1, 3, 2, 4])

# 元のデータポイントをプロット
plt.plot(x, y)

# x_new、bspline、y_new を作成
x_new = np.linspace(1, 5, 50)
bspline = interpolate.make_interp_spline(x, y)
y_new = bspline(x_new)

# 補間後のデータポイントをプロット
plt.plot(x_new, y_new)

plt.show()

実行結果

このコードを実行すると、次のような出力が得られます。元の折れ線に加えて、滑らかに補間された曲線が重ねて描画されます。

matplotlibで滑らかな曲線をプロットする方法!Bスプライン補間の使い方を解説

ポイントの解説

重要なのはnp.linspace()で元のデータより細かい点列を生成し、それをmake_interp_spline()で作成したBスプライン関数に渡す流れです。第3引数の数値(例では50)を大きくするほど、より滑らかな曲線になります。なお、全範囲をカバーしたい場合はnp.linspace(x.min(), x.max(), 100)のように指定するとよいでしょう。

また、Bスプライン補間は元のデータポイントを必ず通る「補間」である点に注意してください。ノイズを含む実測データに対しては、あえて点を通らない平滑化(スムージングスプラインや移動平均など)の方が適している場合もあります。目的に応じて手法を使い分けると、より見やすいグラフを作成できます。

  1. Matplotlibでヒストグラムデータから折れ線グラフを描画する方法

    Matplotlibでヒストグラムのデータをもとに折れ線グラフを描画するには、NumPyのhistogram()メソッドを使ってデータセットのヒストグラムを事前に計算しておくのが便利です。この記事では、同じデータをヒストグラムと折れ線グラフの両方で可視化する手順を解説します。実装の手順現在の図にサブプロットを追加します。nrows=2、ncols=1とし、index=1を指定します。NumPyのhistogram()メソッドを使用して、データセットのヒストグラム(度数とビンの境界値)を取得します。edgecolor=blackを指定してhist()メソッドでヒストグラムを描画します。インデック

  2. Matplotlibで折れ線グラフをアニメーション化する方法を徹底解説

    Matplotlibでは、FuncAnimationを活用することで、折れ線グラフに動きのあるアニメーション効果を簡単に加えることができます。本記事では、基本的な手順と実際に動作するサンプルコードを交えながら、その方法をわかりやすく解説します。折れ線グラフをアニメーション化する基本手順subplots()メソッドを使用して、図(figure)とサブプロットを作成します。x軸・y軸それぞれの表示範囲(スケール)を設定します。NumPyを使って、xおよびtのデータ点を生成します。座標ベクトルからmeshgrid()で座標行列X2とT2を作成します。plot()メソッドでxとFのデータを使い、折れ線