如何调整Matplotlib拟合曲线形态?复现指定拟合曲线求助
解决拟合曲线起始与平稳的问题
你的核心问题是拟合函数选型错误——你用的a*exp(-b*x)+c是指数衰减曲线,天生无法满足x=0时y=0、x增大后趋近于1的需求。
换成饱和增长型的指数函数就能完美匹配原图趋势,推荐使用1 - np.exp(-k * x):
- x=0时,y=0,符合起始要求
- x→∞时,y→1,满足趋近于1后平稳的需求
- 曲线为单调递增的S型,和原图虚线的"Partial Superparticle Ionisation"趋势完全一致
修改后的完整代码
import numpy as np import scipy.optimize as opt import matplotlib.pyplot as plt # 原始数据 x = np.array([0.3, 0.6, 0.7, 0.8, 1.3, 1.5, 3, 4, 5]) y = np.array([0, 0.1, 0.3, 0.55, 0.75, 0.9, 1, 1, 1]) # 更换为符合需求的拟合函数:饱和增长指数函数 def func(x, k): return 1 - np.exp(-k * x) # 拟合时给出初始猜测,帮助curve_fit更好收敛 optimizedParameters, pcov = opt.curve_fit(func, x, y, p0=[0.5]) # 生成密集x点,绘制平滑的虚线拟合曲线 x_fit = np.linspace(0, 5, 100) plt.plot(x_fit, func(x_fit, *optimizedParameters), label="Partial Superparticle Ionisation", linestyle='--') # 绘图设置 plt.ylim(0, 1.1) plt.xlim(0, 5) plt.step(x, y, label="Data") plt.xlabel("Time (ns)") plt.ylabel("$n_H^+ / n_H$") plt.legend() plt.show()
关键修改说明
- 函数替换:用
1 - exp(-k*x)替代原衰减函数,完美匹配起始点和饱和值要求 - 平滑曲线:用
np.linspace生成100个密集点,避免原代码只在原始数据点绘图导致的折线感 - 虚线样式:添加
linestyle='--'还原原图的虚线效果 - 初始猜测:给
curve_fit传入p0=[0.5],避免拟合时出现收敛异常 - 冗余修复:删除了重复导入的
numpy
内容的提问来源于stack exchange,提问作者JoelinRome
相关产品推荐
相关产品推荐

