Python/Matplotlib:在给定截距和斜率的情况下将回归线添加到绘图中

Jon*_*han 5 python plot matplotlib linear-regression

使用以下小数据集:

bill = [34,108,64,88,99,51]
tip =  [5,17,11,8,14,5]  
Run Code Online (Sandbox Code Playgroud)

我计算了最佳拟合回归线(手动).

yi = 0.1462*x - 0.8188 #yi = slope(x) + intercept
Run Code Online (Sandbox Code Playgroud)

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

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
xlabel("Bill amount ($)")
ylabel("Tip amount ($)")

#display plot
plt.show()
Run Code Online (Sandbox Code Playgroud)

我不确定如何将回归线放到情节本身上.我知道有很多内置的东西可以快速拟合和显示最合适的线条,但我这样做是为了练习.我知道我可以在点'0,0.8188'(截距)处开始该线,但我不知道如何使用斜率值来完成该线(设置线端点).

鉴于x轴上的每次增加,斜率应增加"0.1462"; 对于起点我尝试(0,0.8188)的线坐标,以及(100,14.62)终点.但是这条线并没有通过我的质心点.它错过了它.

干杯,乔恩

tdy*_*tdy 7

matplotlib 3.3.0 中的新增功能

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



  • 点斜形式

    (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:+})$')
    
    Run Code Online (Sandbox Code Playgroud)



另请参阅如何使用正确的文本旋转注释回归线。


Imp*_*est 5

问题中的推理部分正确。有了函数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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

当然,装配也可以自动完成。您可以获取坡度并通过调用进行拦截numpy.polyfit:

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

情节中的其余部分将保持不变。