2011-11-21 10 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ではなくTkAggGtkAggQtAgg、など)を使用しているということです。定義上、画面への表示はサポートされていません。

しかし、任意のGUIライブラリとマルチスレッドコードでの作業は、GUIのメインループは独自のスレッドで実行する必要があります。言い換えれば

、画面に表示させることができ、バックエンドへの切り替えは、あなたのマルチスレッドコードに良いもう少し複雑さが必要になります。

これを行うにはいくつかの方法がありますが、一般的な方法は非常に非効率的です。 (簡単な解決策は、これは恐ろしく非効率的である。pyplot.ionを使用して、別のスレッドで他のことをしながら1つのスレッドですべてのxミリ秒キャンバスを描画することです。)

あなたは何」についてもう少し詳細を与えることができますやっている?マルチプロセッシングの代わりにスレッドを使用しているのはなぜですか? (つまり、多くのIOを実行していますか?)あなたはGUIライブラリをどのように使用していますか? (あなたがわからない場合、それはデフォルトのmatplotlibのバックエンドだとして、それは、おそらくTkです。)

+0

あなたの助けのおかげで多くのことを。私は答えがバックエンドに固有であることを認識していませんでした(私は 'pyplot.show()'がやっていたことを解決しようとしましたが、関連コードを見つけられませんでした)。私はTkの[this](http://matplotlib.sourceforge.net/examples/user_interfaces/embedding_in_tk.html)の例を見つけました。これは非常に役に立ちます。マルチスレッドの言及はおそらく赤い鳴き声でした。私はコードクローンをいくつか行い、パイロットを使っていくつかのプロットを保存しました。これをスレッドに移動して、実行中の結果を見ることができました。エラー。 – James

関連する問題