Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

keep matplotlib / pyplot windows open after code termination

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

like image 249
DilithiumMatrix Avatar asked Mar 16 '13 20:03

DilithiumMatrix


People also ask

Can I use matplotlib in idle?

Download the “Install Matplotlib (for PC). bat” file from my web site, and double-click it to run it. Test your installation. Start IDLE (Python 3.4 GUI – 32 bit), type “import matplotlib”, and confirm that this command completes without an error.

Is PLT show () blocking?

show() and plt. draw() are unnecessary and / or blocking in one way or the other.

What is the difference between matplotlib and matplotlib Pyplot?

Pyplot is an API (Application Programming Interface) for Python's matplotlib that effectively makes matplotlib a viable open source alternative to MATLAB. Matplotlib is a library for data visualization, typically in the form of plots, graphs and charts.

Is PLT show () necessary?

Using plt. show() in Matplotlib mode is not required.


1 Answers

On Linux you can detach the display this way:

import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import numpy as np
import os

def detach_display():
    mu, sigma = 0, 0.5
    x = np.linspace(-3, 3, 100)
    plt.plot(x, mlab.normpdf(x, mu, sigma))
    plt.show()    

if os.fork():
    # Parent
    pass
else:
    # Child
    detach_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 mp

def detach_display():
    mu, sigma = 0, 0.5
    x = 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 sys

filename = 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 mlab

mu, 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.

like image 185
unutbu Avatar answered Sep 30 '22 15:09

unutbu