Python Matplotlibは、(最初のチャートウィンドウを閉じた後)2番目のチャートをプロットするように要求されるとハングします
-
10-07-2019 - |
質問
奇妙な振る舞い、私はめちゃくちゃだと確信していますが、何が起こっているのかを知りたいです:
次のコードを実行して、matplotlibを使用して非常に単純なグラフウィンドウを作成しています:
>>> import matplotlib.pyplot as plt
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> ax.plot((1, 3, 1))
[<matplotlib.lines.Line2D object at 0x0290B750>]
>>> plt.show()
そして予想どおり、ポップアップする新しいウィンドウに、y軸に1から3から1に戻る非常に単純な青い線が含まれるグラフを取得します。0、1、2はx軸ポイント(例として)。次に、グラフウィンドウを閉じます(ウィンドウの右上にある十字ボタンを使用)。これにより、インタープリターを制御できるようになり、新しいオブジェクトの作成を再開します。
>>>
>>> fig1 = plt.figure()
>>> bx = fig1.add_subplot(111)
>>> bx.plot((1, 3, 1))
[<matplotlib.lines.Line2D object at 0x029E8210>]
>>> plt.show()
しかし、今回は、何も入っていないウィンドウフレーム(フレームのみ、白い背景は何もない)が表示され、バンシュート全体がハングします。 「タスクを終了」する必要があります。Pythonインタープリターはシステムによって終了され、コマンドプロンプトが返されます。 Macでの同様の動作(実際にハングする前にグラフを最初にプロットすることを除く)。
だからどういうわけか、Pythonやmatplotlibでは、手動でウィンドウを閉じたくありません。誰が何が起こっているのか、私は何をすべきかを知っていますか?私がやりたいのは、インタープリター内からさまざまなプロットをいじることであり、明らかにこの動作は役に立たない。 &quot; Ipython -pylab&quot;を使用できることを知っています。しかし、学習のために、上記のエラーを理解したいと思います。
ありがとう。
解決
明らかに、これはtkinterバックエンドのバグが原因です。例: https://bugs.launchpad.net/ubuntu/ + source / matplotlib / + bug / 313834 。取り組んでいます... 少し古いtkinterライブラリに回帰できる場合は、それが時間の回避策になります(数週間前にこの同じ問題に遭遇しましたが、それが唯一の希望でした)。
他のヒント
パーティに3か月遅れましたが、show()ではなくdraw()を使用するようにmatlibplotドキュメントで提案しました。前者は明らかに現在のプロットのレンダリングを行うだけですが、後者はすべての対話型ツールを起動し、問題が始まるようです。
これはドキュメントの目立った位置にはありませんが、ここにリンクがあります: http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show
価値があるものとして、私はpylab.show()を試してみましたが、まったく同じ問題を抱えていましたが、出力を確認したいだけならpylab.draw()はうまく機能しているようです。
標準のPythonインタープリターの代わりにipythonを使用しようとしましたか?
次のコマンドでipythonをインストールできます:
easy_install ipython
そして、ipythonにはpylabで実行する-pylabと呼ばれる特定のモードがあります:
ipython -pylab
In[1]: ...
私はほとんどの人がこのソリューションを使用してPythonでグラフをプロットすると思います、それはR / Matlab、完了などのコマンドラインに似たコマンドラインであり、すべてのプロットに対して別々のスレッドを実行しますあなたが説明した問題はないはずです。
試しましたか:
plt.close()
プロットオブジェクトを閉じたことを確認するには?
上記のどこかに投稿されたとおり:
最後のプロットを除くすべてのプロットに plt.draw()
を使用します。
最後のプロットには、 plt.show()
奇妙なことですが、最後のコードで plt.show()
を使用せず、代わりに plt.draw()
を試しても、表示されませんプロット。
これで頑張ってください!
TkAggをバックエンドとして使用すると、この問題が発生しました。 plt.close( 'all')
を使用した後、コンピューターがフリーズしました。
解決策は、別のバックエンドに切り替えることでした。代わりにQt4Aggを使用しています。
Qt4Aggがインストールされている場合、次のように入力してバックエンドを切り替えることができます。
plt.switch_backend('Qt4Agg')
データをプロットする前に