7

I am trying to have a plot pop up so the user can confirm that a fitting worked, but not hang up the entire process doing so. However, while the window appears, there is never anything in it, and it is "Not Responding". I suspect that there is a bad interaction with the subprocess functionality, as this code is front-ending and data processing for a simulation being run in 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)

The following subprocess does open. If I remove the ion() call and use mpl.show(), then the plot works fine, but the entire process holds up until the window is closed. I need the process to continue while the user looks at the graph. Is there a way to do this?

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
Elliot
  • 5,211
  • 10
  • 42
  • 70

2 Answers2

8

Instead of the mpl.draw(), try:

mpl.pause(0.001)

when using the matplotlib interactive mode ion(). Note that this only works from matplotlib 1.1.1 RC or higher.

Niels
  • 153
  • 1
  • 6
  • 1
    This does draw the window and continue the processing, but the window immediately goes to "not responding" and closing it stops the whole process. – Elliot Jul 15 '12 at 17:42
  • @Elliot: Do you get the same effect when you do a `plt.show(block=False)` with interactive mode off? – pelson Jul 17 '12 at 21:29
  • 1
    While adding `mpl.pause(0.0001)` instead of `mpl.draw()` managed to display the plot, whenever I try to click on it, the window goes to the "Not Responding" state. Anyone has an idea explaining this? – blue_chip Mar 07 '16 at 21:32
1

This is probably overkill, but since no one had any better solutions I went to the threading module and it worked. If anyone has a simpler way to do this, please let me know.

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()
Elliot
  • 5,211
  • 10
  • 42
  • 70
  • Hmm it looks like this causes issues if the preceding window does not get closed before the next one is opened. Anyone know how to fix this so it can open as many windows as needed? – Elliot Jul 17 '12 at 21:46