グラフをプロットする次の簡単なスクリプトがあります。
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でこれを行う簡単な方法はありますか?私はいくつかのチュートリアルを見つけましたが、それらはすべてかなり複雑に見えます。
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()
この例ではスプラインはうまく機能しますが、関数が本質的に滑らかではなく、滑らかなバージョンにしたい場合は、以下を試すこともできます:
from scipy.ndimage.filters import gaussian_filter1d
ysmoothed = gaussian_filter1d(y, sigma=2)
plt.plot(x, ysmoothed)
plt.show()
シグマを増やすと、より滑らかな関数を得ることができます。
これを慎重に進めてください。元の値を変更しますが、必要なものではない場合があります。
私はあなたの質問の文脈から anti-aliasing ではなく curve-fitting を意味すると思います。 PyPlotにはこれに対する組み込みのサポートはありませんが、 here のようなコードや、GuiQwtを使用している場合はカーブフィッティングがありますので、基本的なカーブフィッティングを簡単に実装できます モジュール 。 (おそらく SciPy からコードを盗むこともできます)。