0

ループ内でグラフ作成呼び出しを繰り返しています。バックエンドは引き続き実行する必要があるため、グラフ作成を別のスレッドに分割しました (バックエンドは C++ へのサブプロセス呼び出しを使用しているため、インタラクティブ モードを使用するとグラフがロックされます)。ただし、これにより、バックエンドが再びグラフ化するときに問題が発生するようです。実行を続けている間、グラフ作成は最初の 2 回目以降失敗します。コードが実行されている限り、追加されたウィンドウを開き続けることができるようにする必要があるため、ユーザーは離れて後で戻ってきても、すべてのグラフを表示できます。必要な数のウィンドウを表示し、基になるコードが終了してもそこに保持するにはどうすればよいですか (ウィンドウは、2 番目のコードが実行を停止するすべての CMD ウィンドウを閉じるのが好きです)。

import subprocess
import threading
from matplotlib import pyplot as mpl
...
for x in data:
...
   if condition:
...
      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()
 ....
   subprocess.Popen(file) 
4

1 に答える 1

0

ブロックしない方法でプロットを実行するだけの複雑な設定のように思えます。インタラクティブモードはマスターをカットしませんか?

import matplotlib.pyplot as plt

plt.interactive(True)

# complex code which produces multiple figures goes here...

# ... and might do something like 
fig1 = plt.figure()
plt.plot(range(10))
plt.draw()

# ... or this
fig2 = plt.figure()
plt.polar(range(10))
plt.draw()

# once everything is done, we can put in a blocking call
# which will terminate when the last window is closed by the user
plt.show(block=True)
于 2012-07-19T06:57:35.607 に答える