使用scipy.curve_fit拟合数据时绘图出现多条重叠线的问题求助
解决scipy curve_fit绘图出现多条重叠线的问题
嘿,我一眼就看出问题啦!你遇到的“多条重叠线”其实不是真的有多个拟合结果,而是你的预测数据(pred_data)是无序的,matplotlib在绘图时会严格按照你给的原始数据顺序连接点,导致折线来回跳跃,看起来就像好几条线叠在一起了。
问题根源
你的pred_data列表是随机顺序的(比如开头是3.0、1.0、1.0,后面又出现9.0、3.0),当你调用plt.plot(pred_data, yaj)时,matplotlib会从第一个点(3.0, 对应yaj值)直接连到第二个点(1.0, 对应yaj值),再连到第三个点(1.0, ...),这种无序的连接就造成了视觉上的“重叠线”效果。
解决方案:先对数据按x轴排序
只需要在绘图前,把pred_data、actu_data和拟合后的yaj按照pred_data的数值从小到大排序,再用排序后的数据绘图就行。
修改后的完整代码如下:
from scipy.optimize import curve_fit from matplotlib import pyplot as plt def func(x, a, b, c): return a * x** b + c # 原始数据 pred_data = [3.0,1.0,1.0,7.0,6.0,1.0,7.0,4.0,9.0,3.0,5.0,5.0,2.0,6.0,8.0] actu_data =[ 3.84,1.55,1.15,7.56,6.64,1.09,7.12,4.17,9.45,3.12,5.37,5.65,1.92,6.27,7.63] # 拟合参数 popt, pcov = curve_fit(func, pred_data, actu_data) yaj = func(pred_data, popt[0], popt[1], popt[2]) # 关键步骤:按pred_data排序所有数据 # 打包数据并排序 sorted_data = sorted(zip(pred_data, actu_data, yaj), key=lambda x: x[0]) # 拆分排序后的数据 sorted_pred, sorted_actu, sorted_yaj = zip(*sorted_data) # 绘图 plt.plot(sorted_pred, sorted_actu, 'ro', label='Data') plt.plot(sorted_pred, sorted_yaj, 'b--', label='Best fit') plt.legend() plt.xlabel('Predicted Market Price') plt.ylabel('Actual Market Price') plt.show()
效果说明
修改后,拟合线会按照x轴从小到大的顺序平滑连接,不会再出现来回跳跃的情况,你就能看到一条清晰的拟合曲线啦。
内容的提问来源于stack exchange,提问作者user8895497
相关产品推荐
相关产品推荐

