Jak wyświetlić dwie figury za pomocą matplotlib?

81

Mam kłopoty rysując jednocześnie dwie figury, nie pokazane na jednym wykresie. Ale zgodnie z dokumentacją napisałem kod i tylko rysunek pokazuje. Myślę, że może straciłem coś ważnego. Czy ktoś mógłby mi pomóc to rozgryźć? Dzięki. (* Tlist_first * użyty w kodzie to lista danych).

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
źródło

Odpowiedzi:

91

Alternatywnie do wywołania plt.show()na końcu skryptu, możesz także kontrolować każdą figurę osobno, wykonując:

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

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

raw_input()

W takim przypadku musisz zadzwonić, raw_inputaby utrzymać figurki przy życiu. W ten sposób możesz dynamicznie wybierać liczby, które chcesz pokazać

Uwaga: w Pythonie 3 raw_input()zmieniono nazwę nainput()

joaquin
źródło
1
Niestety w pythonie 3.6 i najnowszym matplotlib, wywołanie kilku funkcji fig.show () wydaje się nic nie pokazywać. Na koniec nadal muszę zadzwonić do plt.show ().
kakyo
1
@kakyo - Używanie Pythona 3.6.6z Matplotlib 2.2.2(który był najnowszym wydaniem w momencie pisania); powyższe rozwiązanie działa dla mnie. Twój problem musi pochodzić z czegoś innego, np. Używanego zaplecza . Bieganie matplotlib.get_backend(), dostaję'Qt5Agg'
n1k31t4
Musiałem też dodać figure=gdo drugiego plt.hist().
Michael Litvin
czy potrzebuję innych pakietów? NameError: name 'raw_input' is not defined
zheyuanWang
1
@zheyuanWang Jeśli używasz Pythona 3, musisz użyć input(). Zobacz ostatnią notatkę w poście
joaquin
61

Powinieneś zadzwonić plt.show()dopiero na koniec po utworzeniu wszystkich wątków.

janneb
źródło
8
Wydawało mi się to dość denerwujące, ponieważ jak zadzwoniłem show()raz, nie mogę do niego zadzwonić ponownie, jeśli chcę ponownie wyświetlić fabułę, muszę go ponownie odtworzyć?
Alcott,
23

Miałem ten sam problem.


Zrobił:

f1 = plt.figure(1)

# code for figure 1

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


f2 = plt.figure(2)

# code for figure 2

plt.show()


Wpisz „plt.show ()” tylko raz, po ostatniej cyfrze. Pracował dla mnie.

Nikhil Anand
źródło
6
To jest to samo, co odpowiedź od janneb z 2011 roku
n1k31t4
Pokazuje to w tym samym oknie, a nie w dwóch oddzielnych oknach. Odpowiada jednak na pytanie OP. Głosujcie zatem za.
Mike de Klerk
Ale co, jeśli chcesz osobnej fabuły? został wykreślony na tej samej działce
Nhoj_Gonk,
8

Alternatywnie sugerowałbym włączenie interaktywności na początku i wyłączenie na ostatniej działce. Wszystkie się pojawią, ale nie znikną, ponieważ program pozostanie w pobliżu, dopóki nie zamkniesz liczb.

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
źródło