2011-11-21 58 views
5

我明白如何使用pyplot接口(我想!)在屏幕上顯示matplotlib圖。我開始繪製一個多線程程序,並開始導致錯誤,所以我試圖切換到面向對象的接口。我可以做一個簡單的陰謀,並保存到文件使用使用matplotlib繪製屏幕上的圖API

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
from matplotlib.figure import Figure 

fig = Figure() 
can = FigureCanvas(fig) 
ax = fig.add_subplot(111) 
ax.plot((1,2,3)) 
can.print_figure('test') 

但我該如何顯示在屏幕上的這個情節?我看到其他代碼使用can.draw()但沒有任何效果。

另外,請讓我知道是否有任何關於我的代碼以上的不理想 - 我還沒有真正掌握所有這些圖,畫布和軸對象做什麼。

回答

4

您的問題是您使用的是非交互式後端(Agg而不是TkAgg,GtkAgg,QtAgg等)。根據定義,它不支持在屏幕上顯示。

但是,使用任何gui庫處理多線程代碼將需要gui的主循環運行在其自己的線程中。

換句話說,切換到可以顯示到屏幕上的後端將需要多線程代碼中的更多複雜性。

有幾種不同的方式來做到這一點,但任何通用的方法將是非常低效的。 (簡單的解決方案是使用pyplot.ion,然後畫在畫布上的每個x毫秒在一個線程中,而在另一個線程做其他的事情。這是可怕低效。)

您能否給一些關於你更詳細」重新做?你爲什麼使用線程代替多處理? (即,你只是在做很多IO?)你使用的是什麼gui庫? (如果你不知道,那麼它可能是Tk,因爲這是默認的matplotlib後端。)

+0

非常感謝您的幫助。我沒有意識到答案是特定於後端(我試圖找出pyplot.show()正在做什麼,但沒有找到相關的代碼)。我發現[this](http://matplotlib.sourceforge.net/examples/user_interfaces/embedding_in_tk.html)Tk的例子,這非常有幫助。提到多線程可能是一個紅鯡魚 - 我只是有一些代碼做了一些數字處理,並用pyplot保存了一些情節,我試着將它移入一個線程,以便我可以在運行時查看它的結果,並得到很多奇怪的錯誤。 – James