python - 如何在绘制 R2 值时使趋势线穿过原点 - python

标签 python pandas matplotlib trendline

我正在使用一个如下所示的数据框 df:

index       var1      var2      var3
0           0.0       0.0       0.0 
10          43940.7   2218.3    6581.7
100         429215.0  16844.3   51682.7

我想绘制每个变量,绘制它们强制到原点的趋势线,计算并绘制 R2 值。

我在 this post 中找到了我想要的东西但是趋势线没有穿过原点,我找不到让它起作用的方法。

我试图手动修改趋势线第一个点的值,但结果似乎不太好。

for var in df.columns[1:]:
    fig, ax = plt.subplots(figsize=(10,7))
    
    x = df.index
    y = df[var]
    
    z = numpy.polyfit(x, y, 1)
    p = numpy.poly1d(z)
    pylab.plot(x,p(x),"r--")
    
    plt.plot(x,y,"+", ms=10, mec="k")
    z = np.polyfit(x, y, 1)
    y_hat = np.poly1d(z)(x)
    y_hat[0] = 0     ###--- Here I tried to replace the first value with 0 but it doesn't seem right to me.

    plt.plot(x, y_hat, "r--", lw=1)
    text = f"$y={z[0]:0.3f}\;x{z[1]:+0.3f}$\n$R^2 = {r2_score(y,y_hat):0.3f}$"
    plt.gca().text(0.05, 0.95, text,transform=plt.gca().transAxes, fontsize=14, verticalalignment='top')
    

有什么办法吗?任何帮助将不胜感激。

最佳答案

您可以为此使用 Scipy 和 curve_fit。确定您的趋势线为 y=ax,以便它穿过原点。

import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def func(x, a):
    return a * x

xdata = (0,10,20,30,40)
ydata = (0,12,18,35,38)

popt, pcov = curve_fit(func, xdata, ydata)
plt.scatter(xdata, ydata)
plt.plot(xdata, func(xdata, popt),"r--")
plt.show()

plot

关于python - 如何在绘制 R2 值时使趋势线穿过原点 - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64125907/

相关文章:

python - 使用 Pandas 处理事件日志 - 在 DataFrame 中查找下一个匹配项

python - 如何从 matplotlib 中的轴删除 xtics?

python - SqlAlchemy 是否支持 SQL/JSON

python - 如何计算转移概率

Python ElementTree xml 输出到 csv

python - 基于多索引求和列值

python - matplotlib 显示具有自定义日期格式和间隔的 x 轴

python - Matplotlib(Seaborn) set_xticks 与日期时间和时间增量意外工作

python - 两勺 django 1.8 的 ch2.1.1 是什么意思?

Python:向文件添加内容而不删除其旧内容