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

StackOverflow https://stackoverflow.com/questions/1219394

  •  10-07-2019
  •  | 
  •  

Pregunta

Comportamiento extraño, estoy seguro de que soy yo quien está jodiendo, 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))
[<matplotlib.lines.Line2D object at 0x0290B750>]
>>> plt.show()

y, como esperaba, obtengo el gráfico que uno esperaría, en una nueva ventana que ha aparecido, que contiene una línea azul muy simple que va de 1 a 3 de nuevo a 1 nuevamente en el eje y, con 0, 1, 2 como el puntos del eje x (solo como ejemplo). Ahora cierro la ventana del gráfico (usando el botón cruzado en la parte 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))
[<matplotlib.lines.Line2D object at 0x029E8210>]
>>> plt.show()

Esta vez, sin embargo, obtengo un marco de ventana, sin nada (solo el marco, sin fondo blanco, nada), y todo el disparo de la explosión se cuelga. Tengo que finalizar la tarea, el intérprete de Python es terminado por el sistema y recibo un símbolo del sistema. Comportamiento similar en una Mac (excepto que en realidad traza el gráfico primero, antes de colgar también).

Entonces, de alguna manera, 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 desde el intérprete, y obviamente este comportamiento no ayuda. Sé que podría usar " Ipython -pylab " pero en interés del aprendizaje, quiero entender el error anterior.

Gracias.

¿Fue útil?

Solución

Aparentemente, esto es causado por un error en el backend de 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 temporal por el momento (me encontré con esto mismo hace un par de semanas, y esa era mi única esperanza).

Otros consejos

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

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

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

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

Puede 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 las personas usan 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 trama, por lo que no debería tener el problema que ha descrito.

intentaste:

plt.close()

para asegurarse de que cerró el objeto de la trama?

Como se publicó en alguna parte de arriba:

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

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

Es extraño, pero si no usa plt.show () en el último e intenta plt.draw () en su lugar, no verá cualquier parcela.

¡Buena suerte con esto!

Tuve este problema al usar TkAgg como back-end. 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top