2015-07-13 123 views
0

我正在嘗試在我的GUI中編寫刷新圖的代碼,但每次都不是刷新圖中的圖,而是繪製下一個圖n的不同位置。在包含Matplotlib圖的傳統知識中刷新畫布

if tumortypeplot== 'Atypical Teratoid Rhabdoid Tumour': 

    f = Figure(figsize=(7.5,5), dpi=100) 
    f.gca().invert_xaxis() 
    a = f.add_subplot(111) 

    if var1.get()==1: 

     a.errorbar(ppm, atrtave_pf, atrtsd_pf, linestyle='-', ecolor='g', marker='^') 
     a.set_title('Atypical Teratoid - Rhabdoid Tumour_ Posterior fossa') 
     a.set_xlabel('Frequency/ppm') 
     a.set_ylabel('Intensity (au)') 

    elif var2.get()==1: 

     a.errorbar(ppm, atrtave_sp, atrtsd_sp, linestyle='-', ecolor='g', marker='^') 
     a.set_title('Atypical Teratoid - Rhabdoid Tumour_ Supratentorial') 
     a.set_xlabel('Frequency/ppm') 
     a.set_ylabel('Intensity (au)') 

    canvas = FigureCanvasTkAgg(f, master=root) 
    canvas.show() 
    canvas.get_tk_widget().pack(side="right") 

我試過使用a.clf()或a.clear()。但我不工作。 我剛開始使用python,並且幫助你找出我的代碼有什麼問題。

回答

0

由於a是一個軸對象,它沒有明確的數字clf方法。這應該引發一個錯誤,這可能會被try語句隱藏起來?要清除當前軸,您需要撥打a.cla()(或a.clear())。然後,您可以調用一個新的繪圖命令來替換當前圖上的軸。

爲了您的gui,如果這不起作用,您可以清除數字f.clf()並完全替換爲新的情節。請注意,在wxpython中,作爲gui的一部分,您需要使用f.clf(keep_observers=True),然後讀取子圖等a=f.add_subplot(111)以獲得正確的結果。

最快的選項,對於錯誤欄而言很複雜,因爲它包含許多對象,因此它將更新返回句柄中來自錯誤欄函數並重繪的數據。這看起來是這樣的,

eb = a.errorbar(ppm, atrtave_pf, atrtsd_pf, linestyle='-', ecolor='g', marker='^') 

然後,當你已經更新ppmatrtave_pf,並要更新的線路,

line=eb.line[0] 
line.set_data(ppm, atrtave_pf) 
f.canvas.draw() 

雖然你可能必須更新eb的errorbars手動過這可能比它的價值更麻煩。

+0

嗨,謝謝你的評論。我試過a.cla和f.clf(),但它仍然不起作用。我添加爲:f =圖(figsize =(7.5,5),dpi = 100) f.clf(keep_observers = True) f.gca()。invert_xaxis() a = f.add_subplot(1,1 ,1)問題可以用add_subplot嗎?因爲每次它在前一個上面添加另一個子圖。 –

+0

如果你使用'a.gca()',你只能清除軸,並且不需要**添加一個新的子圖,而是使用'a.errorbar(...)'繪製新的數據最近清除的軸。如果你用'f.gcf()'清除了圖形,那麼在調用'a.errorbar(...)'之前可能需要添加一個新的子圖。沒有一個mcv例子(http://stackoverflow.com/help/mcve)爲你的gui很難知道如何重繪對你的情況工作... –