I'd like python to make a plot, display it without blocking the control flow, and leave the plot open after the code exits. Is this possible?
This, and related subjects exist (see below) in numerous other threads, but I can't get the plot to both stay open, and be non-blocking. For example, if I use pyplot.ion()
before pyplot.show()
, or if I use pyplot.show(block=False)
then the plot closes when the code terminates. This is true using either python
or ipython
. If it matters, I'm running on OS X 10.8.2 (Mountain Lion), running python27
and ipython27
Related discussions:
pylab matplotlib "show" waits until window closes
Is there a way to detach matplotlib plots so that the computation can continue?
Keep plotting window open in Matplotlib
Closing pyplot windows
On Linux you can detach the display this way:
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import numpy as np
import osdef detach_display():mu, sigma = 0, 0.5x = np.linspace(-3, 3, 100)plt.plot(x, mlab.normpdf(x, mu, sigma))plt.show() if os.fork():# Parentpass
else:# Childdetach_display()
The main process ends, but the plot remains.
Attempt #2. This also works on Linux; you might give it a try: but not on OS X.
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import numpy as np
import os
import multiprocessing as mpdef detach_display():mu, sigma = 0, 0.5x = np.linspace(-3, 3, 100)plt.plot(x, mlab.normpdf(x, mu, sigma))plt.show()proc = mp.Process(target=detach_display)
proc.start()
os._exit(0)
Without the os._exit(0)
, the main process blocks. Pressing Ctrl-C kills the main process, but the plot remains.
With the os._exit(0)
, the main process ends, but the plot remains.
Sigh. Attempt #3. If you place your matplotlib calls in another script, then you could use subprocess like this:
show.py:
import matplotlib.pyplot as plt
import numpy as np
import sysfilename = sys.argv[1]
data = np.load(filename)
plt.plot(data['x'], data['y'])
plt.show()
test.py
import subprocess
import numpy as np
import matplotlib.mlab as mlabmu, sigma = 0, 0.5
x = np.linspace(-3, 3, 100000)
y = mlab.normpdf(x, mu, sigma)
filename = '/tmp/data.npz'
np.savez(filename, x=x, y=y)
proc = subprocess.Popen(['python', '/path/to/show.py', filename])
Running test.py
should display a plot and return control to the terminal while leaving the plot displayed.