如何使用Python导入Excel数据绘制直方图并完成指数函数拟合
实现步骤
1. 依赖库安装
需要用到4个核心库,执行以下命令安装:pip install pandas matplotlib scipy openpyxl
- pandas:读取Excel文件数据
- matplotlib:绘制直方图与拟合曲线
- scipy:实现指数函数拟合逻辑
- openpyxl:支持读取.xlsx格式的Excel文件,若你的文件是.xls格式,将openpyxl替换为xlrd即可
2. 完整实现代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit # 1. 读取Excel数据,替换为你自己的文件路径、工作表名、数据列名 df = pd.read_excel("your_data.xlsx", sheet_name="Sheet1") # 提取待分析的数值列,同时过滤空值 target_data = df["your_column_name"].dropna() # 2. 定义要拟合的指数函数形式,可根据实际分布调整参数结构 def exponential_func(x, a, b, c): return a * np.exp(-b * x) + c # 3. 绘制直方图同时获取分组统计数据用于拟合 # bins参数控制直方图分组数量,可自行调整 counts, bin_edges, _ = plt.hist(target_data, bins=30, alpha=0.6, label="原始数据分布") # 计算每个分组的中点作为拟合用的x轴数据 bin_centers = (bin_edges[:-1] + bin_edges[1:]) / 2 # 4. 执行指数拟合 # p0为初始参数猜测值,可根据数据量级调整,避免拟合不收敛 popt, _ = curve_fit(exponential_func, bin_centers, counts, p0=[max(counts), 0.1, 0]) # 生成拟合曲线的连续坐标 x_fit = np.linspace(min(bin_centers), max(bin_centers), 1000) y_fit = exponential_func(x_fit, *popt) # 5. 配置图像展示 plt.plot(x_fit, y_fit, "r-", linewidth=2, label=f"拟合曲线:y={popt[0]:.2f}*e^(-{popt[1]:.2f}x)+{popt[2]:.2f}") plt.xlabel("数值区间") plt.ylabel("频数") plt.legend() plt.show()
3. 常见调整说明
- 若不需要指数函数的常数偏移项,可删除参数c,函数修改为
return a * np.exp(-b * x),同时p0对应调整为两个初始值即可 - 如果拟合时报错不收敛,优先调整p0的初始值,尽量贴合你数据的实际幅值、衰减速度量级
- 若需要将直方图归一化为密度分布,将plt.hist的density参数设置为True即可
内容的提问来源于stack exchange,提问作者John Kim
相关产品推荐
相关产品推荐

