PyPlotで滑らかな線を描く


112

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

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

回答:


167

scipy.interpolate.spline自分でデータを平滑化するために使用できます。

from scipy.interpolate import spline

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

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

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

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

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

前: スクリーンショット1

後: スクリーンショット2


2
はは、それは難しくなかった。乾杯!:)探している可能性のある他の人へのメモ:linspace()を使用するには、scipyをインポートする必要がありました。
Paul

申し訳ありませんが、使用する必要がありましたnp.linspace。私の答えを修正しました。
Olivier Verdier

2
300は、T.min()とT.max()の間のポイント数です。1000を使用しましたが、見た目は同じです。5で試してみてください。違いがわかります。
CornSmith、2015

2
spline廃止されました!スプラインは、scipyのダウンロード0.19.0で廃止され、使用のBスプラインクラスの代わりに:from scipy.interpolate import BSpline
user890739

2
Tがソートされていない場合、これは機能しません。また、functiton(T)が1対1でない場合。
Rahat Zaman

28

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

from scipy.ndimage.filters import gaussian_filter1d

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

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

これは注意して続行してください。それは元の値を変更し、あなたが望むものではないかもしれません。


10
これは注意して続行してください。それは元の値を変更し、あなたが望むものではないかもしれません。
tartaruga_casco_mole 2018年

8

あなたの質問の文脈から、あなたはカーブフィッティングを意味し、アンチエイリアシングを意味しないと思います。PyPlotにはこれに対するサポートが組み込まれていませんが、ここに示されているコードのように、基本的なカーブフィッティングを簡単に実装できます。(SciPyからコードを盗んでこれを行うこともできます)。


ありがとう。私は10種類の方程式を試しましたが、その中で[放射状基底関数を使用した平滑化/補間] [1] rbf = Rbf(x, y), fi = rbf(xi)が最良でした。[1]:scipy-cookbook.readthedocs.io/items/RadialBasisFunctions.html
クラウドチョー

1

scipy.interpolateいくつかの例については、ドキュメントを参照してください。

次の例は、線形および3次スプライン補間での使用方法を示しています。

>>> from scipy.interpolate import interp1d

>>> x = np.linspace(0, 10, num=11, endpoint=True)
>>> y = np.cos(-x**2/9.0)
>>> f = interp1d(x, y)
>>> f2 = interp1d(x, y, kind='cubic')

>>> xnew = np.linspace(0, 10, num=41, endpoint=True)
>>> import matplotlib.pyplot as plt
>>> plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')
>>> plt.legend(['data', 'linear', 'cubic'], loc='best')
>>> plt.show()

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.