matplotlib 在给定截距和斜率的情况下,将回归线添加到图中

qv7cva1a  于 2023-10-24  发布在  其他
关注(0)|答案(3)|浏览(94)

使用以下小数据集:

bill = [34,108,64,88,99,51]
tip =  [5,17,11,8,14,5]

我计算了最佳拟合回归线(手工)。

yi = 0.1462*x - 0.8188 #yi = slope(x) + intercept

我使用Matplotlib绘制了我的原始数据,如下所示:

plt.scatter(bill,tip, color="black")
plt.xlim(20,120) #set ranges
plt.ylim(4,18)

#plot centroid point (mean of each variable (74,10))
line1 = plt.plot([74, 74],[0,10], ':', c="red")
line2 = plt.plot([0,74],[10,10],':', c="red")

plt.scatter(74,10, c="red")

#annotate the centroid point
plt.annotate('centroid (74,10)', xy=(74.1,10), xytext=(81,9),
        arrowprops=dict(facecolor="black", shrink=0.01),
        )

#label axes
plt.xlabel("Bill amount ($)")
plt.ylabel("Tip amount ($)")

#display plot
plt.show()

我不确定如何将回归线绘制到图上。我知道有很多内置的东西可以快速拟合和显示最佳拟合线,但我这样做是为了练习。我知道我可以从点'0,0.8188'(截距)开始绘制线,但我不知道如何使用斜率值来完成线(设置线的端点)。
假设x轴上每增加一点,斜率就应该增加'0.1462';对于线坐标,我尝试将(0,0.8188)作为起点,将(100,14.62)作为终点。但是这条线没有通过我的质心点。它只是错过了它。

cmssoen2

cmssoen21#

问题中的推理部分正确。有一个函数f(x) = a*x +b,你可以把与y轴(x=0)相交的第一个点作为(0, b)(或在这种情况下(0,-0.8188))。
这条线上的任何其他点由(x, f(x))(x, a*x+b)给出。所以看x=100处的点会得到(100, f(100)),插入:(100, 0.1462*100-0.8188) = (100,13.8012)。在你在问题中描述的情况下,你只是忘记考虑b
下面展示了如何使用该函数在matplotlib中绘制直线:

import matplotlib.pyplot as plt
import numpy as np

bill = [34,108,64,88,99,51]
tip =  [5,17,11,8,14,5]  
plt.scatter(bill, tip)

#fit function
f = lambda x: 0.1462*x - 0.8188
# x values of line to plot
x = np.array([0,100])
# plot fit
plt.plot(x,f(x),lw=2.5, c="k",label="fit line between 0 and 100")

#better take min and max of x values
x = np.array([min(bill),max(bill)])
plt.plot(x,f(x), c="orange", label="fit line between min and max")

plt.legend()
plt.show()

当然,拟合也可以自动完成。您可以通过调用numpy.polyfit来获得斜率和截距:

#fit function
a, b = np.polyfit(np.array(bill), np.array(tip), deg=1)
f = lambda x: a*x + b

其余的情节将保持不变。

2skhul33

2skhul332#

matplotlib 3.3.0新增功能

plt.axline现在可以更容易地绘制回归线(或任意无限线)。

*斜率截距形式

这对于回归线来说是最简单的。使用np.polyfit计算斜率m和截距b,并将它们插入plt.axline

# y = m * x + b
m, b = np.polyfit(x=bill, y=tip, deg=1)
plt.axline(xy1=(0, b), slope=m, label=f'$y = {m}x {b:+}$')

*点坡形式

如果沿着直线有其他任意点(x1, y1)沿着,它也可以与斜率一起使用:

# y - y1 = m * (x - x1)
x1, y1 = (1, -0.6741)
plt.axline(xy1=(x1, y1), slope=m, label=f'$y {-y1:+} = {m}(x {-x1:+})$')

*两分

也可以使用任意两个沿着的点:

xy1 = (1, -0.6741)
xy2 = (0, -0.8203)
plt.axline(xy1=xy1, xy2=xy2, label=f'${xy1} \\rightarrow {xy2}$')

mzaanser

mzaanser3#

定义函数拟合,获取数据的端点,放入元组中进行绘图()

def fit(x):
    return 0.1462*x - 0.8188 #yi = slope(x) - intercept
xfit, yfit = (min(bill), max(bill)), (fit(min(bill)), fit(max(bill)))    
plt.plot(xfit, yfit,'b')

相关问题