mantenga las ventanas de matplotlib / pyplot abiertas después de la terminación del código

Me gustaría que Python haga un gráfico, lo muestre sin bloquear el flujo de control y deje el gráfico abierto después de que salga el código. es posible?

Este y otros temas relacionados existen (ver más abajo) en muchos otros hilos, pero no puedo hacer que la ttwig permanezca abierta y no esté bloqueada. Por ejemplo, si uso pyplot.ion() antes de pyplot.show() , o si uso pyplot.show(block=False) , la ttwig se cierra cuando el código termina. Esto es cierto usando python o ipython . Si importa, me estoy ejecutando en OS X 10.8.2 (Mountain Lion), ejecutando python27 e ipython27

Discusiones relacionadas:
pylab matplotlib “show” espera hasta que la ventana se cierre
¿Hay alguna manera de separar los gráficos de matplotlib para que el cálculo pueda continuar?
Mantener la ventana de trazado abierta en Matplotlib
Cierre de ventanas pyplot

En Linux puedes separar la pantalla de esta manera:

 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() 

El proceso principal termina, pero la ttwig permanece.


Intento # 2. Esto también funciona en Linux; Puedes intentarlo, pero no en 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) 

Sin el os._exit(0) , el proceso principal se bloquea. Presionar Ctrl-C mata el proceso principal, pero la ttwig permanece.

Con os._exit(0) , el proceso principal finaliza, pero la ttwig permanece.


Suspiro. Intento # 3. Si coloca sus llamadas de matplotlib en otro script, entonces podría usar un subproceso como este:

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]) 

La ejecución de test.py debe mostrar un gráfico y devolver el control al terminal mientras se deja el gráfico mostrado.

Si bien esto no responde directamente a la pregunta, lo más práctico que he encontrado es (usar show (bloque = Falso) y) ejecutar el script en segundo plano. De esa manera, la (s) ttwig (s) permanecerá y volverá a aparecer el indicador de comandos de la shell y el script se cerrará cuando cierre la ventana de la ttwig …