7

ユーザーがフィッティングが機能したことを確認できるようにプロットをポップアップさせようとしていますが、そうすることでプロセス全体を停止することはありません。ただし、ウィンドウが表示されている間は何も表示されず、「応答なし」になります。このコードはフロントエンドであり、C ++で実行されているシミュレーションのデータ処理であるため、サブプロセス機能との相互作用が悪いと思われます。

import subprocess
import numpy as np
from matplotlib import pyplot as mpl
...
mpl.ion()
fig = mpl.figure()
ax = fig.add_subplot(1,1,1)
ax.grid(True)
ax.plot(x, y, 'g')
ax.scatter(X, Y, c='b')
ax.scatter(min_tilt, min_energy, c='r')
mpl.draw()
...
subprocess.call(prog)

次のサブプロセスが開きます。ion()呼び出しを削除してを使用するmpl.show()と、プロットは正常に機能しますが、ウィンドウが閉じるまでプロセス全体が保持されます。ユーザーがグラフを見ている間、プロセスを続行する必要があります。これを行う方法はありますか?

4

2 に答える 2

8

mpl.draw()の代わりに、次を試してください。

mpl.pause(0.001)

matplotlibインタラクティブモードion()を使用する場合。これはmatplotlib1.1.1RC以降でのみ機能することに注意してください。

于 2012-07-15T12:28:13.490 に答える
1

これはおそらくやり過ぎですが、誰もより良い解決策を持っていなかったので、私はスレッドモジュールに行き、それはうまくいきました。誰かがこれを行うためのより簡単な方法を持っているなら、私に知らせてください。

import subprocess
import threading
from matplotlib import pyplot as mpl
...
class Graph(threading.Thread):
   def __init__(self,X,Y,min_tilt, min_energy):
       self.X = X
       self.Y = Y
       self.min_tilt = min_tilt
       self.min_energy = min_energy
       threading.Thread.__init__(self)

   def run(self):
       X = self.X
       Y = self.Y
       dx = (X.max()-X.min())/30.0
       x = np.arange(X.min(),X.max()+dx,dx)
       y = quad(x,fit)
       fig = mpl.figure()
       ax = fig.add_subplot(1,1,1)
       ax.grid(True)
       ax.plot(x, y, 'g')
       ax.scatter(X, Y, c='b')
       ax.scatter(self.min_tilt, self.min_energy, c='r')
       mpl.show()
thread = Graph(X,Y,min_tilt,min_energy)
thread.start()
于 2012-07-17T20:54:23.590 に答える