如何在Python中为带y误差的x、y数据拟合并绘制线性回归直线?
没问题!我来帮你在现有代码基础上添加直线拟合的功能,尤其是考虑到你有y方向的误差,我们可以用加权最小二乘拟合来得到更准确的结果~
实现带误差的直线拟合并绘图
核心思路
因为你有y轴的误差数据(DM_err),加权拟合能让误差更小的数据点对拟合结果产生更大影响,比普通最小二乘更合理。我们用numpy.polyfit来实现,然后把拟合直线和原始数据一起可视化。
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt # 读取数据文件 Data = np.loadtxt('dmvals.dat') MJD = Data[:,0] DM = Data[:,1] DM_err = Data[:,2] # --- 新增:直线拟合部分 --- # 加权最小二乘拟合,权重取1/误差平方,拟合一次多项式(直线) weights = 1 / (DM_err ** 2) slope, intercept = np.polyfit(MJD, DM, 1, w=weights) # 生成拟合直线的y值 DM_fit = slope * MJD + intercept # --- 拟合部分结束 --- font = {'family': 'serif', 'color': 'blue', 'weight': 'normal', 'size': 14, } plt.figure() plt.xlabel('time[MJD]', fontdict=font) plt.ylabel('DM[pc/cm^3]', fontdict=font) plt.title('DM values with Linear Fit', fontdict=font) # 标题更新为包含拟合说明 # 绘制原始误差棒图,加上标签区分 plt.errorbar(MJD, DM, DM_err, color='magenta', fmt='o', label='Data with Errors') # 绘制拟合直线,标注拟合公式 plt.plot(MJD, DM_fit, color='darkblue', linestyle='--', label=f'Fit: DM = {slope:.4f}*MJD + {intercept:.4f}') plt.legend(fontsize=12) # 添加图例,让图更清晰 plt.subplots_adjust(left=0.15 , hspace = 0.5) plt.savefig('dm_variations_with_fit_plot.png') plt.show() # 可选,直接显示图像
关键细节说明
- 加权拟合:
np.polyfit的w参数传入1/(DM_err**2),这是统计上的标准做法,误差越小的数据点权重越高。如果不需要加权,去掉w=weights即可做普通最小二乘拟合。 - 拟合标签:用f-string把斜率和截距直接显示在图例里,方便你直观查看拟合结果。
- 图例:给误差棒和拟合直线都加上
label参数,再用plt.legend()展示,让图像信息更清晰。
可选:计算拟合优度(R²值)
如果你想评估拟合效果,可以添加这段代码计算R²值(越接近1说明拟合越好):
# 计算R²值 y_mean = np.mean(DM) ss_total = np.sum((DM - y_mean)**2) ss_residual = np.sum((DM - DM_fit)**2) r_squared = 1 - (ss_residual / ss_total) print(f"拟合优度R²: {r_squared:.4f}")
内容的提问来源于stack exchange,提问作者abubakr yagob
相关产品推荐
相关产品推荐

