如何在同一幅图中用指定指数方程拟合多组CSV数据并绘制曲线
多组CSV指数拟合同图绘制实现方案
依赖库
- numpy
- pandas
- matplotlib
- scipy
完整实现代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.optimize import curve_fit # 自定义拟合函数 def func(x, a, c): return a - 1/2 * np.exp(-(x - 1)/c) # 配置参数 csv_list = ["10.csv", "20.csv", "30.csv", "40.csv", "50.csv"] # 自定义配色,区分不同组数据 color_list = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd"] # 生成拟合用的平滑x序列,保证曲线显示效果 x_smooth = np.linspace(1, 100, 500) # 可根据实际x的取值范围调整上下限 plt.figure(figsize=(10, 6), dpi=100) # 遍历处理每组数据 for idx, csv_name in enumerate(csv_list): # 读取CSV,无表头场景默认按索引取列 df = pd.read_csv(csv_name, header=None) x = df.iloc[:, 1].values y = df.iloc[:, 2].values # 拟合求解参数 popt, _ = curve_fit(func, x, y) a, c = popt # 计算拟合优度R²,不需要可删除 y_fit_raw = func(x, *popt) ss_res = np.sum((y - y_fit_raw) ** 2) ss_tot = np.sum((y - np.mean(y)) ** 2) r2 = 1 - (ss_res / ss_tot) # 绘制原始散点 plt.scatter(x, y, color=color_list[idx], s=15, alpha=0.6, label=f"{csv_name} 原始数据") # 绘制拟合曲线,直接在图例中标注c参数值 y_fit_smooth = func(x_smooth, *popt) plt.plot(x_smooth, y_fit_smooth, color=color_list[idx], linewidth=2, label=f"{csv_name} 拟合曲线 (c={c:.2f}, R²={r2:.3f})") # 图表美化配置 plt.xlabel("自变量x", fontsize=12) plt.ylabel("精度值y", fontsize=12) plt.legend(fontsize=10) plt.grid(alpha=0.3) plt.show()
注意事项
- 如果拟合出现不收敛报错,可给
curve_fit添加初始值参数,例如popt, _ = curve_fit(func, x, y, p0=[0.9, 5]),p0的两个值分别对应a和c的初始猜测值,可根据实际数据范围调整 - 若CSV文件带表头,需删除
pd.read_csv中的header=None参数,改为按列名取数即可 x_smooth的取值范围可根据实际x的最小、最大值调整,保证曲线覆盖全部数据区间
内容的提问来源于stack exchange,提问作者Codeholic
相关产品推荐
相关产品推荐

