2009-08-02 11 views
9

comportamiento extraño, estoy seguro de que soy yo metiendo la pata, pero me gustaría llegar al fondo de lo que está sucediendo:Python Matplotlib cuelga cuando se le preguntó a trazar un segundo gráfico (después de cerrar la primera ventana del gráfico)

estoy funcionando con el siguiente código para crear una ventana gráfica muy sencilla usando matplotlib:

>>> import matplotlib.pyplot as plt 
>>> fig = plt.figure() 
>>> ax = fig.add_subplot(111) 
>>> ax.plot((1, 3, 1)) 
[<matplotlib.lines.Line2D object at 0x0290B750>] 
>>> plt.show() 

y como se esperaba consigo la carta era de esperar, en una nueva ventana que ha aparecido, que contiene una muy simple línea azul va de 1 a 3 de nuevo a 1 nuevamente en el eje y, con 0, 1, 2 como puntos del eje x (solo como ejemplo). Ahora cierro la ventana del gráfico (usando el botón cruzado en la esquina superior derecha debajo de Windows). Esto me da el control al intérprete, y empezar de nuevo, la creación de nuevos objetos:

>>> 
>>> fig1 = plt.figure() 
>>> bx = fig1.add_subplot(111) 
>>> bx.plot((1, 3, 1)) 
[<matplotlib.lines.Line2D object at 0x029E8210>] 
>>> plt.show() 

Esta vez, sin embargo, me sale un marco de ventana, sin nada en él (sólo el marco, ningún fondo blanco nada), y toda la sesión de bang se cuelga. Tengo que "finalizar la tarea", el intérprete de Python es terminado por el sistema y me devuelve un símbolo del sistema. Comportamiento similar en un Mac (excepto que en realidad traza el gráfico primero, antes de colgar también).

De modo que Python y/o matplotlib no quieren que cierre la ventana manualmente. ¿Alguien sabe lo que está pasando y lo que debería estar haciendo? Lo que me gustaría hacer es jugar con diferentes tramas dentro del intérprete, y obviamente este comportamiento no ayuda. Sé que podría usar "Ipython -pylab", pero con el interés de aprender, quiero entender el error anterior.

Gracias.

Respuesta

2

Aparentemente, esto es causado por un error en el backend tkinter. Ver, por ejemplo, https://bugs.launchpad.net/ubuntu/+source/matplotlib/+bug/313834. Se está trabajando en ... Si puede regresar a una biblioteca tkinter un poco más antigua, eso debería ser una solución para el tiempo (me encontré con lo mismo hace un par de semanas, y esa era mi única esperanza).

0

¿Usted intentó:

plt.close() 

para asegurarse de que cerró el objeto trama?

+0

que tengo ahora Casey, pero ningún cambio. Cuando llamo a plt.show(), muestra que la ventana del gráfico por el intérprete de Python deja de funcionar, es decir, no tengo un aviso. Solo cuando cierro la ventana recupero el aviso. Si luego llamo a plt.close() y luego continúo, se comporta exactamente de la misma manera, es decir, se bloquea. Tener la sensación (cavando en el sitio web de Matplotlib) de que básicamente quieren que te mantengas en iPython en el modo -pylab. –

+0

intente descargar scipy, si no lo tiene ya e importar pylab. funciona igual que matplotlib. – Nope

+0

No, nada tampoco. Si import pylab, y haz todo lo anterior, se comporta exactamente de la misma manera. –

2

¿Ha intentado utilizar ipython en lugar del intérprete estándar de python?

Puede instalar ipython con el siguiente comando:

easy_install ipython 

y luego, ipython tiene un modo específico que se corrió con pylab, llamado -pylab:

ipython -pylab 

In[1]: ... 

Creo que la mayoría de la gente usa esta solución para trazar gráficos con python, es una línea de comando similar a la de R/Matlab, completition, etc ... y ejecuta un hilo separado para cada gráfico, por lo que no debería tener el problema que tienes descrito.

+0

Gracias, sí, conozco la ruta de Ipython (ver comentarios anteriores). De hecho, parece que este es el camino a seguir, aunque también puede ser un poco impredecible. Creo que tienes razón sin embargo. Basicall Ipython es el camino a seguir. –

8

Tres meses tarde para la fiesta, pero encontré una sugerencia en la documentación de matlibplot para usar draw() en lugar de show(); el primero aparentemente solo hace un render de la trama actual, mientras que el segundo inicia todas las herramientas interactivas, que es donde los problemas parecen comenzar.

no es terriblemente un lugar prioritario en la documentación, pero aquí está el enlace: pylab.show http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show

Por lo que vale la pena, lo he intentado() y tenía exactamente el mismo problema que hizo, mientras que pylab. draw() parece funcionar bien si solo quiero ver el resultado.

+0

Gracias Rico - útil. Tres meses no es demasiado tarde, ya que ahora estoy volviendo a matplotlib después de un momento de inactividad. –

+0

Gracias por el enlace. Siempre he estado confundido acerca de show() y draw() y finalmente encuentro buena información al respecto. – Viktiglemma

+0

Es 2014 con Matplotlib 1.4 fuera y esta respuesta sigue siendo relevante. – SkyNT

0

Como ha escrito en algún lugar por encima de:

Uso plt.draw() para todas sus parcelas excepto la última.

Para su última trama, utilice plt.show()

Es raro, pero si usted no utiliza plt.show() en el último y tratar plt.draw() lugar, que no ven parcelas.

¡Buena suerte con esto!

0

Tuve este problema al usar TkAgg como servidor. Después de usar plt.close('all') mi computadora se congeló.

La solución fue cambiar a un backend diferente. Ahora uso Qt4Agg en su lugar.

Si tiene Qt4Agg installed es posible cambiar los software escribiendo:

plt.switch_backend('Qt4Agg') 

antes de trazar los datos

Cuestiones relacionadas