1

重複の可能性:
プロットが消えないようにする方法は?

私はいくつかのデータを分析するためのコマンドラインインターフェースのPythonプログラムを書いています。それはユーザーにたくさんの質問をし、スクリプトのいくつかのポイントでmatplotlib pyplotプロットが表示されますが、それを表示して次のようなスクリプトを続行したいと思います。

import matplotlib.pyplot as plt
import numpy as np

plt.figure()
plt.plot(np.arange(10),np.arange(10)**2)

plt.show()
print 'continuing the program'

サブプロットと一緒に使用してみplt.draw()ましたが、スクリプト内では機能しないようです。

編集:plt.ion()プロットウィンドウが応答せず、ズームインツールなどのボタンが表示されない以外の種類の作品を使用しました

4

1 に答える 1

2

plt.show()ユーザーがウィジェット/ウィンドウを閉じるまで戻りません。多くの場合、この動作は問題ありません。とにかくユーザーが素晴らしいグラフを見るのに時間を費やしている間に、スクリプトを続行する必要があるのはなぜですか?:-)ただし、プログラムを続行する必要がある場合は、threadingモジュールを使用してください。メインスレッドを終了させる前plt.show()に、新しいスレッドとこのスレッドを呼び出します。join()

編集:

物事はそれほど単純ではないようです。私は以下を作成しましたtest.py

import threading
from matplotlib import pyplot as p
import time

p.plot([_ for _ in xrange(5)])

t = threading.Thread(target=p.show)
t.start()

for i in xrange(5):
    print "lala %s" % i
    time.sleep(1)

print "Waiting for plot thread to finish..."
t.join()
print "Finished."

テストすると、次のエラーが発生します。

14:43:42 $ python test.py
lala 0
lala 1
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.6/threading.py", line 484, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/pymodules/python2.6/matplotlib/backends/backend_tkagg.py", line 73, in show
    manager.show()
  File "/usr/lib/pymodules/python2.6/matplotlib/backends/backend_tkagg.py", line 385, in show
    if not self._shown: self.canvas._tkcanvas.bind("<Destroy>", destroy)
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 988, in bind
    return self._bind(('bind', self._w), sequence, func, add)
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 938, in _bind
    needcleanup)
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1101, in _register
    self.tk.createcommand(name, f)
RuntimeError: main thread is not in main loop

p.show()これから、メインスレッドから呼び出す必要があると推測します。多分あなたはそれを逆にやらなければならないでしょう:あなたのユーザー入力を別のスレッドで取得してください。

于 2012-09-11T12:36:07.833 に答える