2017-02-28 31 views
1

このコードから、 "out.best_fit"で最終フィットを印刷できます。私が今やりたいことは、各ピークを個々のガウス関数それらのすべてが1つの単一の曲線にマージされているのではない。python-lmfitでフィッティングしたガウス曲線の後に個々のピークをプロットする

from pylab import * 
from lmfit import minimize, Parameters, report_errors 
from lmfit.models import GaussianModel, LinearModel, SkewedGaussianModel 
from scipy.interpolate import interp1d 
from numpy import * 

fit_data = interp1d(x_data, y_data) 

mod = LinearModel() 
pars = mod.make_params(slope=0.0, intercept=0.0) 
pars['slope'].set(vary=False) 
pars['intercept'].set(vary=False) 


x_peak = [278.35, 334.6, 375] 
y_peak = [fit_data(x) for x in x_peak] 


i = 0 
for x,y in zip(x_peak, y_peak): 
    sigma = 1.0 
    A = y*sqrt(2.0*pi)*sigma 
    prefix = 'g' + str(i) + '_' 

    peak = GaussianModel(prefix=prefix) 

    pars.update(peak.make_params(center=x, sigma=1.0, amplitude=A)) 

    pars[prefix+'center'].set(min=x-20.0, max=x+20.0) 

    pars[prefix+'amplitude'].set(min=0.0) 
    mod = mod + peak 
    i += 1 

out = mod.fit(y_data, pars, x=x_data) 

plt.figure(1) 
plt.plot(x_data, y_data) 
plt.figure(1) 
plt.plot(x_data, out.best_fit, '--') 

グローバルフィットのプロット:私はあなたがフィットした後にこれをしたいと思います

Screenshot

+1

'x_data'と' y_data'とは何ですか? – Cleb

+0

申し訳ありませんが、それらはxとyのデータの2つのリストです。 – TMR

+0

'out'からフィットパラメータを取得できませんか?彼らは、フィットのy値を計算するためにどこかに格納しなければなりません。次に、フィットパラメータを抽出すると、単一のガウス分布をプロットすることができます。 –

答えて

1

、複合モデルの ModelResult.eval_components()が返されている
components = out.eval_components(x=x_data) 
for model_name, model_value in components.items(): 
    plt.plot(x_data, model_value) 

# or more simply, if you prefer: 
plt.plot(x_data, components['g0_']) 
plt.plot(x_data, components['g1_']) 
... 

コンポーネントモデルの接頭辞であるキーを持つ辞書、およびそのコンポーネントの計算モデルである値が含まれます。

+0

ありがとうございましたM Newville、それは私が探していたものです。しかし、私は専門家ではありませんが、私は組み込みモデルを使用しているので、あなたの提案は自分のコードでは機能しません。とにかく、自分のモデルに合わせる必要があるので、Modelクラスを使用する必要があります。次に、私はあなたのソリューションを使用できると思います。 – TMR

+1

ModelResult.eval_components()は、組み込みモデルを使用するモデルを含むあらゆる複合モデルで動作するはずです。 –

関連する問題