web-dev-qa-db-ja.com

PyPlotで滑らかなラインをプロット

グラフをプロットする次の簡単なスクリプトがあります。

import matplotlib.pyplot as plt
import numpy as np

T = np.array([6, 7, 8, 9, 10, 11, 12])
power = np.array([1.53E+03, 5.92E+02, 2.04E+02, 7.24E+01, 2.72E+01, 1.10E+01, 4.70E+00])

plt.plot(T,power)
plt.show()

今のように、線は一点から一点にまっすぐに進みますが、私の意見ではより良いかもしれません。私が望むのは、ポイント間の線を滑らかにすることです。 Gnuplotでは、smooth cplinesでプロットしていました。

PyPlotでこれを行う簡単な方法はありますか?私はいくつかのチュートリアルを見つけましたが、それらはすべてかなり複雑に見えます。

98
Paul

scipy.interpolate.splineを使用して、自分でデータを平滑化できます。

from scipy.interpolate import spline

xnew = np.linspace(T.min(),T.max(),300) #300 represents number of points to make between T.min and T.max

power_smooth = spline(T,power,xnew)

plt.plot(xnew,power_smooth)
plt.show()

splineはscipy 0.19.0で非推奨になりました。代わりにBsplineクラスを使用してください。

splineからBsplineへの切り替えは簡単なコピー/貼り付けではなく、少し調整する必要があります。

from scipy.interpolate import make_interp_spline, BSpline

xnew = np.linspace(T.min(),T.max(),300) #300 represents number of points to make between T.min and T.max

spl = make_interp_spline(T, power, k=3) #BSpline object
power_smooth = spl(xnew)

plt.plot(xnew,power_smooth)
plt.show()

前: - screenshot 1

後: screenshot 2

142
Olivier Verdier

この例ではスプラインはうまく機能しますが、関数が本質的に滑らかではなく、滑らかなバージョンにしたい場合は、以下を試すこともできます:

from scipy.ndimage.filters import gaussian_filter1d

ysmoothed = gaussian_filter1d(y, sigma=2)
plt.plot(x, ysmoothed)
plt.show()

シグマを増やすと、より滑らかな関数を得ることができます。

これを慎重に進めてください。元の値を変更しますが、必要なものではない場合があります。

11
Sajad Norouzi

私はあなたの質問の文脈から anti-aliasing ではなく curve-fitting を意味すると思います。 PyPlotにはこれに対する組み込みのサポートはありませんが、 here のようなコードや、GuiQwtを使用している場合はカーブフィッティングがありますので、基本的なカーブフィッティングを簡単に実装できます モジュール 。 (おそらく SciPy からコードを盗むこともできます)。

7
Nick Bastin