在Python中使用np.polyfit绘制带有y轴不确定性的图表

3

I have the following dataframe:

x      y           error_on_y
1      1.2         0.1
2      0.87        0.23
4      1.12        0.11
5      0.75        0.06
5      0.66        0.15
6      0.98        0.08
7      1.34        0.05
7      2.86        0.12

我想使用这个框架来使用 np.polyfit 来拟合回归线。 我使用以下代码进行了拟合:

x = np.array(dataframe['x'])
y = np.array(dataframe['y'])

y_err = np.array(dataframe['error_on_y'])

np.polyfit(x,y,deg=1, w=1/y_err, cov=True)

然而,我无法找到如何在Python中使用定义的误差绘制拟合线的方法。到目前为止,我发现使用np.polyfit进行绘图的唯一示例是没有涉及指定权重的拟合线。
有人知道我该如何绘制这条线吗?还是有人知道一个好的例子链接?我自己找不到一个很好的示例已经找了相当长时间,所以对此问题的任何专业知识都将非常受欢迎和感激!
编辑/澄清:
当未在函数中定义权重(w)时,polyfit函数会返回一个单矢量,其中包含最小化平方误差的系数。然而,当定义了w时,还会添加另一个矢量: np.polyfit(x,y,deg=1, w=1/y_err, cov=True) 输出:
(array([0.00097481, 0.82290694]), array([[ 4.75261249e-09, -2.28408710e-07],
    [-2.28408710e-07,  1.41696109e-05]]))

编辑/补充信息:

在找到这个链接(https://peteris.rocks/blog/extrapolate-lines-with-numpy-polyfit/)之后,我发现如果没有定义权重,polyfit函数只返回第一个数组。也就是说:

vector = array([0.00097481, 0.82290694])

在直线函数y = mx + b中,m = vector [0]b = vector [1]。也就是说,m是斜率,b是截距。这意味着上面示例中的附加向量必须是函数中定义的权重的结果。
我正在尝试找出如何在包括权重的情况下解释/绘制它 :)
可能的答案: 我找到了以下内容:
import numpy as np
new = np.polyfit(x,y,deg=1, w=1/y_err, cov=True)
m, b = new[0]
a,c = new[1][0]
d,e = new[1][1]
m, b, a,c, d,e

for i in range(min(x), max(x)):
    plt.plot(i, i * m + b, 'go')
    plt.plot(i, i * (m+a) + (b+c), 'bo')
    plt.plot(i, i * (m-d) + (b-e), 'ro')

plt.show()

在这个例子中,我假设给定的第一个数组/向量是:
(array([0.00097481, 0.82290694]), array([[ 4.75261249e-09, -2.28408710e-07],
        [-2.28408710e-07,  1.41696109e-05]]))

这些系数用于拟合回归线。下面的两个数组表示回归线上的误差。我尝试了以下方法,我认为这很有道理。但这并不是最终确定的方案,所以我会开放帖子供大家评论、提出意见和更好的解决方案。


如果您还没有看过scipy中的numpy.polyfit,请去了解一下。 - Cezar Cobuz
谢谢Elliad,我确实看过这个链接,但它绝对是在帖子中包含的好链接! - Jonas
1个回答

1
当你执行np.polyfit(x,y,deg=1, w=1/y_err, cov=True)时,你正在计算一个多项式的系数(除其他外)。为了方便地操作这些系数,你可以创建一个多项式对象。
p, mycov = np.poly1d(np.polyfit(x,y,deg=1, w=1/y_err, cov=True))

并使用绘图。
x_plot = np.linspace(1, 7, 100)
plt.plot(x_plot, p(x_plot))

谢谢您的回复,Yuca。不幸的是,当我尝试运行时,出现了以下错误:ValueError: could not broadcast input array from shape (2,2) into shape (2)。不过我想我已经找到了答案。我将把它放在上面的问题中。 - Jonas
出于好奇,移除cov参数是否解决了问题? - Yuca
抱歉回复晚了。移除协方差参数确实解决了错误并绘制了回归线。然而,这样做将不包括协方差在内的回归线。但是,当这不是目标时,仍然是一个好的解决方案。我会给你点赞! - Jonas
我想要,但不幸的是我不能接受这个作为完整的答案。通过执行“p,mycov”,我们仅仅将额外的向量存储在mycov变量中,但是后来我们并没有绘制/解释这个变量/向量的意义。因此,你提供的答案有所帮助,但我认为它并不是完整的回答这个问题。 - Jonas
有趣的是,你的问题是如何绘制回归拟合线,而这正是我给出的答案。 - Yuca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接