解決問題:
1 一張畫布畫多個子圖;
2 matplotlib繪圖中文不能顯示問題
3 線繪圖函式plt.plot()與散點繪圖函式plt.scatter()之間的區別
上程式碼:
1 #lwlr繪圖比較3個yHat(k取1,0.01,0.003) 2 def lwlrPlot3(xArr,yArr): #輸入:xArr是n×d矩陣/陣列/列表;yArr是n×1 3 4 xMat=mat(xArr) 5 srtInd=xMat[:,1].argsort(0) #等價於argsort(xMat[:,1],0) 6 xSort=xMat[srtInd][:,0,:] #等價於xMat[srtInd.flatten().A[0]] 7 8 yHat1=lwlrTest(xArr,xArr,yArr,1) #呼叫區域性加權迴歸(lwlr)主函式 9 yHat2=lwlrTest(xArr,xArr,yArr,0.01) 10 yHat3=lwlrTest(xArr,xArr,yArr,0.03) 11 12 fig=plt.figure() 13 ax1=fig.add_subplot(311) 14 ax2=fig.add_subplot(312) 15 ax3=fig.add_subplot(313) 16 17 #畫直線圖需要排序 18 #直線圖plt.plot(),plot前要排序 19 #ax1.plot(xMat[:,1],yHat[:].T) 20 ax1.plot(xSort[:,1],yHat1[srtInd]) 21 ax2.plot(xSort[:,1],yHat2[srtInd]) 22 ax3.plot(xSort[:,1],yHat3[srtInd]) 23 24 #畫散點圖不需要排序,plt.scatter() 25 ax1.scatter(xMat[:,1].flatten().A[0],mat(yArr).T.flatten().A [0],s=2,c='r',label=u'欠擬合') 26 ax2.scatter(xMat[:,1].flatten().A[0],mat(yArr).T.flatten().A[0],s=2,c='r',label=u'最好') 27 ax3.scatter(xMat[:,1].flatten().A[0],mat(yArr).T.flatten().A[0],s=2,c='r',label=u'過擬合') 28 29 ax1.legend(loc='upper left') 30 ax2.legend(loc='upper left') 31 ax3.legend(loc='upper left') 32 33 plt.show()
注意:1 程式碼中呼叫了區域性加權迴歸主函式"lwlrTest()",參見"python--區域性加權迴歸"
2 為了解決繪圖時中文顯示亂碼問題,需在程式碼前端加入以下三行程式碼:
1 ''' 2 解決python matplotlib畫圖無法顯示中文的問題! 3 ''' 4 from pylab import * 5 mpl.rcParams['font.sans-serif']=['SimHei'] 6 mpl.rcParams['axes.unicode_minus']=False
繪圖結果: