GUI:Graphical User Interface 圖形用戶界面
實現代碼:
from numpy import * from tkinter import * import regressionTrees import matplotlib matplotlib.use("TkAgg") # 設定后端為TkAgg from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure def reDraw(tolS, tolN): reDraw.f.clf() # 清空之前的圖像 reDraw.a = reDraw.f.add_subplot(111) # 重新添加子圖 if chkBtnVar.get(): # 檢查復選框是否選中,確定是模型樹還是回歸樹 if tolN < 2: tolN = 2 myTree = regressionTrees.createTree(reDraw.rawDat, regressionTrees.modelLeaf, regressionTrees.modelErr, (tolS, tolN)) yHat = regressionTrees.createForeCast(myTree, reDraw.testDat, regressionTrees.modelTreeEval) else: #回歸樹 myTree = regressionTrees.createTree(reDraw.rawDat, ops=(tolS, tolN)) yHat = regressionTrees.createForeCast(myTree, reDraw.testDat) reDraw.a.scatter(array(reDraw.rawDat[:, 0]),array(reDraw.rawDat[:, 1]), s=5) # 畫真實值的散點圖 reDraw.a.plot(reDraw.testDat, yHat, linewidth=2.0) # 畫預測值的直線圖 reDraw.canvas.draw() def getInputs(): # 獲取用戶輸入的值,tolN期望得到整數值,tolS期望得到浮點數, try: tolN = int(tolNentry.get()) # 在Entry部件調用get方法, except: tolN = 10 print("輸入int型數值作為tolN") tolNentry.delete(0, END) tolNentry.insert(0, "10") try: tolS = float(tolSentry.get()) except: tolS = 1.0 print("輸入浮點型數值作為tolS") tolSentry.delete(0, END) tolSentry.insert(0, "1.0") return tolN, tolS def drawNewTree(): # 有人點擊ReDraw按鈕時就會調用該函數 tolN, tolS = getInputs() # 得到輸入框的值 reDraw(tolS, tolN) root = Tk() # Label(root, text="繪制占位符").grid(row=0, columnspan=3) # 設置文本,第0行,距0的行值為3, reDraw.f = Figure(figsize=(5,4),dpi=100) reDraw.canvas = FigureCanvasTkAgg(reDraw.f, master=root) reDraw.canvas.draw() reDraw.canvas.get_tk_widget().grid(row=0, columnspan=3) Label(root, text="tolN").grid(row=1, column=0) tolNentry = Entry(root) # Entry為允許單行文本輸入的文本框,設置文本框,再定位置第1行第1列,再插入數值 tolNentry.grid(row=1, column=1) tolNentry.insert(0, "10") Label(root, text="tolS").grid(row=2, column=0) tolSentry = Entry(root) tolSentry.grid(row=2, column=1) tolSentry.insert(0, "1.0") Button(root, text="重畫", command=drawNewTree).grid(row=1, column=2, rowspan=3) # Botton按鈕,設置第1行第2列,列值為3 chkBtnVar = IntVar() # IntVar為按鈕整數值小部件 chkBtn = Checkbutton(root, text="模型樹", variable=chkBtnVar) chkBtn.grid(row=3, column=0, columnspan=2) reDraw.rawDat = mat(regressionTrees.loadDataSet("sine.txt")) reDraw.testDat = arange(min(reDraw.rawDat[:, 0]), max(reDraw.rawDat[:, 0]), 0.01) reDraw(1.0, 10) root.mainloop()
書上源代碼有以下錯誤:
AttributeError: 'FigureCanvasTkAgg' object has no attribute 'show'
解決方法:
將show()改為draw()即可。
ValueError: Masked arrays must be 1-D
解決方法:將矩陣改成數組。
將:
reDraw.a.scatter(reDraw.rawDat[:, 0],reDraw.rawDat[:, 1], s=5)
改為:
reDraw.a.scatter(array(reDraw.rawDat[:, 0]),array(reDraw.rawDat[:, 1]), s=5)
運行結果為:
勾選“模型樹”,重畫圖形:
改變tolN和tolS的值,可以得到不同的回歸樹和模型樹。