¿Cómo mostrar dos figuras usando matplotlib?

81

Tengo algunos problemas al dibujar dos figuras al mismo tiempo, que no se muestran en un solo diagrama. Pero de acuerdo con la documentación, escribí el código y solo se muestra la figura uno. Creo que tal vez perdí algo importante. ¿Alguien podría ayudarme a averiguarlo? Gracias. (El * tlist_first * usado en el código es una lista de datos).

plt.figure(1)
plt.hist(tlist_first, bins=2000000, normed = True, histtype ="step", cumulative = True, color = 'g',label = 'first answer')
plt.ylabel('Percentage of answered questions')
plt.xlabel('Minutes elapsed after questions are posted')

plt.axvline(x = 30, ymin = 0, ymax = 1, color = 'r', linestyle = '--', label = '30 min')
plt.axvline(x = 60, ymin = 0, ymax = 1, color = 'c', linestyle = '--', label = '1 hour')
plt.legend()
plt.xlim(0,120)
plt.ylim(0,1) 
plt.show()
plt.close() ### not working either with this line or without it

plt.figure(2)
plt.hist(tlist_first, bins=2000000, normed = True, histtype ="step", cumulative = True, color = 'g',label = 'first answer')

plt.ylabel('Percentage of answered questions')
plt.xlabel('Minutes elapsed after questions are posted')

plt.axvline(x = 240, ymin = 0, ymax = 1, color = 'r', linestyle = '--', label = '30 min')
plt.axvline(x = 1440, ymin = 0, ymax = 1, color = 'c', linestyle = '--', label = '1 hour')
plt.legend(loc= 4)
plt.xlim(0,2640)
plt.ylim(0,1)
plt.show()
AnneS
fuente

Respuestas:

91

Alternativamente a llamar plt.show()al final del script, también puede controlar cada figura por separado haciendo:

f = plt.figure(1)
plt.hist........
............
f.show()

g = plt.figure(2)
plt.hist(........
................
g.show()

raw_input()

En este caso debes llamar raw_inputpara mantener vivas las figuras. De esta manera puede seleccionar dinámicamente qué figuras desea mostrar.

Nota: raw_input()se cambió el nombre a input()en Python 3

Joaquín
fuente
1
Desafortunadamente, con python3.6 y el último matplotlib, llamar a varios fig.show () parece no mostrar nada. Todavía tengo que llamar a plt.show () al final.
kakyo
1
@kakyo: uso de Python 3.6.6con Matplotlib 2.2.2(que era la última versión en el momento de escribir este artículo); la solución anterior funciona para mí. Su problema debe provenir de otra cosa, por ejemplo, el backend utilizado. Corriendo matplotlib.get_backend(), obtengo'Qt5Agg'
n1k31t4
También tuve que sumar figure=gal segundo plt.hist().
Michael Litvin
¿Necesito otros paquetes? NameError: name 'raw_input' is not defined
zheyuanWang
1
@zheyuanWang Si está usando Python 3, debe usar input(). Ver última nota en la publicación
joaquin
61

Debe llamar plt.show()solo al final después de crear todas las parcelas.

Janneb
fuente
8
Encontré esto bastante molesto, ya que si llamo show()una vez, no puedo volver a llamar, si quiero mostrar la trama nuevamente, ¿tengo que volver a escribirla?
Alcott
23

Yo tuve el mísmo problema.


Hizo:

f1 = plt.figure(1)

# code for figure 1

# don't write 'plt.show()' here


f2 = plt.figure(2)

# code for figure 2

plt.show()


Escriba 'plt.show ()' solo una vez, después de la última cifra. Trabajó para mi.

Nikhil Anand
fuente
6
Esta es la misma que la respuesta de janneb en 2011
n1k31t4
Esto lo muestra en la misma ventana, no en 2 ventanas separadas. Sin embargo, responde la pregunta de OP. Por lo tanto, vota a favor.
Mike de Klerk
Pero, ¿y si quieres una trama separada? fue trazado en la misma parcela
Nhoj_Gonk
8

Alternativamente, sugeriría activar interactivo al principio y en la última trama, apagarlo. Todos aparecerán, pero no desaparecerán, ya que su programa permanecerá activo hasta que cierre las cifras.

import matplotlib.pyplot as plt
from matplotlib import interactive

plt.figure(1)
... code to make figure (1)

interactive(True)
plt.show()

plt.figure(2)
... code to make figure (2)

plt.show()

plt.figure(3)
... code to make figure (3)

interactive(False)
plt.show()
Tom Mozdzen
fuente