如何在LMFIT多模型拟合中提取pv1_model数据单独绘图?
提取单个拟合模型数据并绘制填充曲线的解决方案
问题背景
用户提供的多组分拟合代码如下:
x_1=np.array(x) y_1=np.array(y) exp_model = ExponentialModel(prefix='exp_') pv1_model = PseudoVoigtModel(prefix='pv1_') pv2_model = PseudoVoigtModel(prefix='pv2_') pv3_model = PseudoVoigtModel(prefix='pv3_') mod = exp_model+pv1_model+pv2_model+pv3_model pars=exp_model.guess(y_1, x=x_1) #background pars.update(pv1_model.make_params()) pars['pv1_center'].set(value=1483, min=1433, max=1533) pars.update(pv2_model.make_params()) pars['pv2_center'].set(value=1150, min=1100, max=1200) pars.update(pv3_model.make_params()) pars['pv3_center'].set(value=1050, min=1000, max=1100) out = mod.fit(y_1, pars, x=x_1) print(out.fit_report())
需求是从拟合结果中提取pv1_model的单独拟合数据,用于绘制该模型的拟合曲线并填充图形,但out.best_fit是所有模型的拟合值总和,需要解决方法。参考示例图为:一张包含原始数据点、总拟合曲线、单个组分拟合曲线及填充区域的光谱拟合图。
解决方案
直接利用拟合结果中的最优参数,单独调用对应模型的计算方法即可,步骤如下:
提取
pv1_model的最优参数
拟合结果out中包含所有模型的最优参数,通过前缀pv1_筛选出对应参数,构建pv1_model的参数集:pv1_params = out.params.prefix_reduce('pv1_')计算
pv1_model的单独拟合值
使用筛选后的参数,传入pv1_model的eval方法计算x轴对应的拟合y值:pv1_fit = pv1_model.eval(pv1_params, x=x_1)绘制
pv1_model的曲线并填充
结合原始数据和其他拟合结果,使用matplotlib绘制曲线并填充区域,示例代码:import matplotlib.pyplot as plt # 绘制原始数据 plt.scatter(x_1, y_1, label='原始数据', s=5) # 绘制总拟合曲线 plt.plot(x_1, out.best_fit, label='总拟合曲线', color='black') # 绘制pv1_model拟合曲线 plt.plot(x_1, pv1_fit, label='pv1组分拟合曲线', color='red') # 填充pv1拟合曲线与基线之间的区域 plt.fill_between(x_1, 0, pv1_fit, color='red', alpha=0.3) plt.xlabel('X轴') plt.ylabel('Y轴') plt.legend() plt.show()补充说明
如果需要结合背景模型(exp_model)绘制组分曲线(即组分叠加在背景上的形态),可同时计算背景值并相加:exp_params = out.params.prefix_reduce('exp_') exp_fit = exp_model.eval(exp_params, x=x_1) pv1_with_bg = exp_fit + pv1_fit # 绘制带背景的pv1组分曲线 plt.plot(x_1, pv1_with_bg, label='pv1组分(含背景)', color='orange')
内容的提问来源于stack exchange,提问作者user25339472
相关产品推荐
相关产品推荐

