首页 文章

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

提问于
浏览
5

使用以下小数据集:

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绘制了原始数据,如下所示:

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()

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

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

干杯,乔恩

3 回答

  • 4

    问题的推理部分正确 . 有一个函数 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()
    

    enter image description here

    当然,配件也可以自动完成 . 你可以通过调用 numpy.polyfit 获得斜率和截距:

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

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

  • 0

    定义函数拟合,获取数据的 endpoints ,将元组放入plot()

    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')
    
  • 1

    快速说明:我认为回归的公式应该是

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

    我的意思是代替 - .

相关问题