Python Matplotlib se bloquea cuando se le pide que trace un segundo gráfico (después de cerrar la primera ventana del gráfico)

Comportamiento extraño, estoy seguro de que soy yo quien lo arruina, pero me gustaría llegar al fondo de lo que está sucediendo:

Estoy ejecutando el siguiente código para crear una ventana gráfica muy simple usando matplotlib:

>>> import matplotlib.pyplot as plt >>> fig = plt.figure() >>> ax = fig.add_subplot(111) >>> ax.plot((1, 3, 1)) [] >>> plt.show() 

y como era de esperar, obtengo el gráfico que se esperaría, en una nueva ventana que apareció, que contiene una línea azul muy simple que va de 1 a 3 de nuevo a 1 en el eje y, con 0, 1, 2 como puntos del eje x (como ejemplo). Ahora cierro la ventana del gráfico (usando el botón en cruz en la esquina superior derecha debajo de las ventanas). Esto me da control al intérprete, y comienzo de nuevo, creando nuevos objetos:

 >>> >>> fig1 = plt.figure() >>> bx = fig1.add_subplot(111) >>> bx.plot((1, 3, 1)) [] >>> plt.show() 

Esta vez, sin embargo, me sale un marco de ventana, sin nada en él (solo el marco, no hay fondo blanco, nada), y todo el bang shoot cuelga. Tengo que “finalizar la tarea”, el intérprete de python es cancelado por el sistema y me devuelven un indicador de comando. Comportamiento similar en un mac (excepto que en realidad traza el gráfico primero, antes de colgar).

Así que de alguna manera Python y / o matplotlib no quieren que cierre la ventana manualmente. ¿Alguien sabe qué está pasando y qué debería estar haciendo? Lo que me gustaría hacer es jugar con diferentes ttwigs desde dentro del intérprete, y obviamente este comportamiento no ayuda. Sé que podría usar “Ipython -pylab”, pero en aras del aprendizaje, quiero entender el error anterior.

Gracias.

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 momento (encontré esta misma cosa hace un par de semanas, y esa era mi única esperanza).

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

No ocupa un lugar muy prominente en la documentación, pero aquí está el enlace: http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show

Para lo que vale, he intentado pylab.show () y tuve exactamente el mismo problema que tú, mientras que pylab.draw () parece funcionar bien si solo quiero ver el resultado.

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

Puedes instalar ipython con el siguiente comando:

 easy_install ipython 

y luego, ipython tiene un modo específico para ejecutarse 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, finalización, etc. y ejecuta un hilo separado para cada gráfico, por lo que no debería Ten el problema que has descrito.

has probado:

 plt.close() 

¿Para asegurarse de cerrar el objeto de la ttwig?

Como se publicó en algún lugar arriba:

Use plt.draw() para todas sus plots, excepto la última.

Para su última plot, use plt.show()

Es raro, pero si no usa plt.show() en el último e intenta con plt.draw() , no verá ningún gráfico.

Buena suerte con esto!

Tuve este problema al usar TkAgg como backend. 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 instalado , es posible cambiar los backends escribiendo:

 plt.switch_backend('Qt4Agg') 

antes de trazar datos