Wie zeige ich zwei Figuren mit matplotlib?

79

Ich habe einige Probleme beim Zeichnen von zwei Figuren gleichzeitig, die nicht in einer einzigen Handlung gezeigt werden. Aber laut Dokumentation habe ich den Code geschrieben und nur die Abbildung zeigt. Ich denke, vielleicht habe ich etwas Wichtiges verloren. Könnte mir jemand helfen, es herauszufinden? Vielen Dank. (Die im Code verwendete * tlist_first * ist eine Liste von Daten.)

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
quelle

Antworten:

89

Alternativ zum Aufrufen plt.show()am Ende des Skripts können Sie jede Figur auch separat steuern , indem Sie Folgendes tun:

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

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

raw_input()

In diesem Fall müssen Sie anrufen raw_input, um die Zahlen am Leben zu erhalten. Auf diese Weise können Sie dynamisch auswählen, welche Figuren Sie anzeigen möchten

Hinweis: raw_input()wurde input()in Python 3 umbenannt

Joaquin
quelle
1
Leider scheint es mit python3.6 und der neuesten matplotlib nichts zu zeigen, wenn man mehrere fig.show () aufruft. Ich muss am Ende noch plt.show () aufrufen.
Kakyo
1
@kakyo - Verwenden von Python 3.6.6mit Matplotlib 2.2.2(dies war die neueste Version zum Zeitpunkt Ihres Schreibens); Die obige Lösung funktioniert für mich. Ihr Problem muss von etwas anderem stammen, z . B. vom verwendeten Backend . Laufen matplotlib.get_backend(), ich bekomme'Qt5Agg'
n1k31t4
Ich musste auch figure=gzum zweiten hinzufügen plt.hist().
Michael Litvin
brauche ich andere pakete NameError: name 'raw_input' is not defined
zheyuanWang
1
@zheyuanWang Wenn Sie Python 3 verwenden, müssen Sie verwenden input(). Siehe letzte Anmerkung in der Post
Joaquin
59

Sie sollten plt.show()erst am Ende aufrufen, nachdem Sie alle Diagramme erstellt haben.

janneb
quelle
7
Ich fand das ziemlich ärgerlich, denn wenn ich show()einmal anrief, kann ich es nicht noch einmal anrufen. Wenn ich die Handlung noch einmal zeigen möchte, muss ich sie erneut umspielen?
Alcott
23

Ich hatte das gleiche Problem.


Hat:

f1 = plt.figure(1)

# code for figure 1

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


f2 = plt.figure(2)

# code for figure 2

plt.show()


Schreiben Sie 'plt.show ()' nur einmal nach der letzten Zahl. Hat für mich gearbeitet.

Nikhil Anand
quelle
6
Dies ist das gleiche wie die Antwort von Janneb im Jahr 2011
n1k31t4
Dies zeigt es im selben Fenster, nicht in zwei separaten Fenstern. Beantwortet die Frage von OP. Upvote daher.
Mike de Klerk
Aber was ist, wenn Sie ein separates Grundstück wollen? es wurde auf dem gleichen Grundstück
gezeichnet
6

Alternativ würde ich vorschlagen, Interaktiv am Anfang einzuschalten und beim letzten Plot auszuschalten. Alle werden angezeigt, aber sie werden nicht verschwinden, da Ihr Programm so lange bestehen bleibt, bis Sie die Zahlen schließen.

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
quelle