Python曲线拟合后按拟合参数m分段差异化绘图问题求助
曲线拟合分段显示实现方案
核心问题说明
原有代码的错误逻辑如下:
- 在循环中重复调用
curve_fit执行拟合操作,属于冗余计算,拟合仅需执行1次即可拿到全局参数m、n - 生成
yfit1、yfit2时未做切片,每次都用全量x计算得到完整拟合曲线,最终绘制的两条拟合线完全重合,无法体现分段效果
修正后可运行代码
import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt # 原始数据 x = [2, 1.95, 1.9, 1.85, 1.8, 1.75, 1.7, 1.65, 1.6, 1.55, 1.5, 1.45, 1.4, 1.35, 1.3, 1.25, 1.2, 1.15, 1.1, 1.05, 1.01] y = [1, 1, 1, 1, 0.99, 0.938, 0.9, 0.857, 0.762, 0.686, 0.59, 0.529, 0.509, 0.47, 0.462, 0.452, 0.452, 0.452, 0.457, 0.43,0.424] # 定义拟合函数 def func(x, m, n): return 1 - 1/2 * np.exp(-(x - m)/(n)) # 仅执行1次拟合获取参数 params, covs = curve_fit(func, x, y) m, n = params print("params: ", params) print("covariance: ", covs) # 转换为numpy数组方便布尔索引 x_arr = np.array(x) y_arr = np.array(y) # 计算全量拟合值 y_fit_all = func(x_arr, m, n) # 拆分x>=m和x<m的两部分 mask_ge = x_arr >= m mask_lt = x_arr < m # 绘制原始数据分段 plt.plot(x_arr[mask_ge], y_arr[mask_ge], 'bo', linestyle='solid', marker=">", label="原始数据 x >= %.3f"%m) plt.plot(x_arr[mask_lt], y_arr[mask_lt], 'go', linestyle='solid', marker="<", label="原始数据 x < %.3f"%m) # 绘制拟合曲线分段 plt.plot(x_arr[mask_ge], y_fit_all[mask_ge], 'r-', linewidth=2, label="拟合曲线 x >= %.3f"%m) plt.plot(x_arr[mask_lt], y_fit_all[mask_lt], 'orange', linestyle='--', linewidth=2, label="拟合曲线 x < %.3f"%m) plt.xlabel('x') plt.ylabel('y') plt.legend(loc='best', fancybox=True, shadow=True) plt.grid(False) plt.show()
效果说明
- 原始数据按照x和m的大小关系分别用蓝色右箭头、绿色左箭头区分,连线保持连续
- 拟合曲线按照x和m的大小关系分别用红色实线、橙色虚线区分
- 所有内容在同一画布展示,分段效果清晰可辨
内容的提问来源于stack exchange,提问作者Codeholic
相关产品推荐
相关产品推荐

