如何在Python中将多组曲线拟合结果展示于同一图表?
解决方案
核心思路是不要在单次拟合后调用pyplot.show(),将所有绘图操作集中在同一画布完成,最后统一展示。同时通过循环批量处理所有数组的行数据,用颜色、标记区分不同曲线。
修改后的完整代码
import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt # 定义拟合用的二次函数(和你现有代码逻辑匹配) def objective(x, a, b, c): return a * x + b * np.square(x) + c # 将4个数组放入列表统一处理,替换为你实际的数组变量名 target_arrays = [center_1080, center_720, center_480, center_360] # 为每个数组分配专属颜色,方便区分 color_palette = ['red', 'blue', 'green', 'orange'] x = np.arange(0, 10) # 用更密集的步长生成x轴点,让拟合曲线更平滑 x_line = np.arange(min(x), max(x)+1, 0.1) # 循环处理每个数组 for arr_idx, current_arr in enumerate(target_arrays): # 循环处理当前数组的每一行 for row_idx, y_data in enumerate(current_arr): # 执行曲线拟合 popt, _ = curve_fit(objective, x, y_data) a, b, c = popt print(f'数组{arr_idx+1} 第{row_idx+1}行: y = %.5f * x + %.5f * x^2 + %.5f' % (a, b, c)) # 绘制原始数据散点 plt.scatter(x, y_data, marker='o', alpha=0.5, label=f'数组{arr_idx+1} 行{row_idx+1} 原始点') # 绘制拟合曲线 y_line = objective(x_line, a, b, c) plt.plot(x_line, y_line, '--', color=color_palette[arr_idx], label=f'数组{arr_idx+1} 行{row_idx+1} 拟合曲线') # 添加图表基础元素 plt.xlabel('X') plt.ylabel('Y') plt.title('所有拟合曲线对比') # 将图例放在画布外侧,避免遮挡曲线 plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.grid(True) # 最后统一展示所有绘图内容 plt.show()
关键改动说明
- 统一画布管理:所有绘图操作都在
plt.show()之前执行,确保所有曲线、散点都渲染在同一张图中。 - 批量循环处理:通过嵌套循环遍历4个数组的所有行,避免重复编写单一行的拟合、绘图代码。
- 曲线区分策略:用不同颜色标记不同数组的曲线,配合图例清晰标注每条曲线的来源。
- 拟合线优化:缩小
x_line的步长,让拟合曲线更平滑直观。
注意事项
- 如果你的拟合函数不是二次函数,直接替换
objective函数即可,整体逻辑无需调整。 - 若曲线数量过多导致图例拥挤,可简化图例文字(如只保留数组+行号),或调整图例位置。
- 确保所有数组的x轴范围一致(你当前场景下都是0-9,无需额外处理),若x范围不同,需将
x_line范围统一为所有数据的最小、最大值区间。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

