You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:06:20