当前位置: 首页 > 后端技术 > Python

python散点图:如何添加拟合线并显示拟合方程和R方?

时间:2023-03-26 11:35:20 Python

polyfit()函数可以使用最小二乘法将一些点拟合成一条曲线。numpy.polyfit(x,y,deg,rcond=None,full=False,w=None,cov=False)#x:要拟合的点的横坐标#y:要拟合的点的纵坐标#??deg:自由度。比如自由度为2,那么拟合曲线就是一个二次函数,而自由度为3,拟合曲线就是3次函数首先我们来构造需要拟合的散点#求解坐标轴刻度负号乱码plt.rcParams['axes.unicode_minus']=False#解决中文乱码问题plt.rcParams['font.sans-serif']=['Simhei']importnumpyasnpiimportmatplotlib.pyplotaspltx=np.arange(-1,1,0.02)y=2*np.sin(x*2.3)+np.random.rand(len(x))然后打印出来看plt.scatter(x,y)plt.show()然后用polyfit函数把这些点拟合成一条三次曲线parameter=np.polyfit(x,y,3)output结果就是三次方程的参数,我们可以拼接方程如下y2=parameter[0]*x**3+parameter[1]*x**2+parameter[2]*x+parameter[3]打印拟合结果plt.scatter(x,y)plt.plot(x,y2,color='g')plt.show()您也可以使用poly1d()f函数帮我们拼接方程,结果是一样的p=np.poly1d(parameter)plt.scatter(x,y)plt.plot(x,p(x),color='g')plt.show()评价指标Rsquared2Dscatterforarbitraryfunction推导了最小二乘最小二乘拟合中相关系数与R平方的关系。其中,相关系数矩阵用于计算R平方correlation=np.corrcoef(y,y2)[0,1]#相关系数correlation**2#R端先看poly1d的输出结果函数p=np.poly1d(pparameter,variable='x')print(p)输出为【保存外链图片失败,源站可能有防盗链机制,建议保存图片直接上传(img-zSADuKOn-1591242453375)(4_3_1.png)]这里是把结果输出成两行,但是输出成两行很不方便。尝试自己写函数,让输出变成一行。parameter=[-2.44919641,-0.01856314,4.12010434,0.47296566]#coefficientaa=''deg=3foriinrange(deg+1):bb=round(parameter[i],2)#bb是第i个子项系数ifbb>=0:ifi==0:bb=str(bb)else:bb='+'+str(bb)else:bb=''+str(bb)ifdeg==i:aa=aa+bbelse:aa=aa+bb+'x^'+str(deg-i)print(aa)输出为:[外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-FH2vxR2C-1591242453377)(4_3_2.png)]封装成函数defCurve_Fitting(x,y,deg):parameter=np.polyfit(x,y,deg)#fitdegdegreedegreepolynomialp=np.poly1d(parameter)#fitdegdegreedegreepolynomialaa=''#equationsplicing——————————————————foriinrange(deg+1):bb=round(参数[i],2)ifbb>0:ifi==0:bb=str(bb)else:bb='+'+str(bb)else:bb=str(bb)ifdeg==i:aa=aa+bbelse:aa=aa+bb+'x^'+str(deg-i)#方程拼接————————————————————plt.scatter(x,y)#原始数据散点图plt.plot(x,p(x),color='g')#绘制拟合曲线#plt.text(-1,0,aa,fontdict={'size':'10','color':'b'})plt.legend([aa,round(np.corrcoef(y,p(x))[0,1]**2,2)])#拼接后的方程和R平方放在图例中plt.show()#print('曲线方程为:',aa)#print('r^2is:',round(np.corrcoef(y,p(x))[0,1]**2,2))使用封装函数重画图Curve_Fitting(x,y,3)