Nach diesen Anweisungen im Python-Interpreter erhält man ein Fenster mit einem Plot:
from matplotlib.pyplot import *
plot([1,2,3])
show()
# other code
Leider weiß ich nicht, wie ich die von erstellte Figur weiterhin interaktiv untersuchen soll, show()
während das Programm weitere Berechnungen durchführt.
Ist das überhaupt möglich? Manchmal sind die Berechnungen lang und es wäre hilfreich, wenn sie während der Prüfung der Zwischenergebnisse fortgesetzt würden.
python
matplotlib
plot
meteore
quelle
quelle
ion()
behebt das Problem.os.fork()
aber denken Sie daran, dass die Verwendungos.fork()
schwierig sein kann, da Sie einen neuen Prozess erstellen, indem Sie den alten Prozess kopieren.Antworten:
Verwenden Sie
matplotlib
Anrufe, die nicht blockieren:Verwenden von
draw()
:Interaktiven Modus verwenden:
quelle
draw()
funktioniert bei mir nicht, es öffnet kein Fenster. Die Verwendung vonshow(block=False)
anstelle vondraw()
scheint jedoch in matplotlib 1.1 den Trick zu tun.draw()
hat auch bei mir nicht funktioniert, nurpause(0.001)
: stackoverflow.com/questions/28269157/…Verwenden Sie das Schlüsselwort 'block', um das Blockierungsverhalten zu überschreiben, z
um deinen Code fortzusetzen.
quelle
Es ist besser, immer bei der Bibliothek zu überprüfen, die Sie verwenden, wenn sie die Verwendung auf nicht blockierende Weise unterstützt.
Wenn Sie jedoch eine allgemeinere Lösung wünschen oder wenn es keine andere Möglichkeit gibt, können Sie mithilfe des
multprocessing
in Python enthaltenen Moduls alles ausführen, was in einem separaten Prozess blockiert . Die Berechnung wird fortgesetzt:Dies hat den Aufwand, einen neuen Prozess zu starten, und ist in komplexen Szenarien manchmal schwieriger zu debuggen. Daher würde ich die andere Lösung bevorzugen (unter Verwendung
matplotlib
der nicht blockierenden API-Aufrufe ).quelle
if __name__ == '__main__':
?Versuchen
Die
show()
Dokumentation sagt:quelle
WICHTIG : Nur um etwas klar zu machen. Ich gehe davon aus, dass sich die Befehle in einem
.py
Skript befinden und das Skript zBpython script.py
von der Konsole aus aufgerufen wird .Ein einfacher Weg, der für mich funktioniert, ist:
Beispiel einer
script.py
Datei:quelle
Möglicherweise möchten Sie dieses Dokument in
matplotlib
der Dokumentation mit dem Titel lesen :Verwenden von matplotlib in einer Python-Shell
quelle
In meinem Fall wollte ich, dass mehrere Fenster während der Berechnung angezeigt werden. Als Referenz ist dies der Weg:
PS. Eine sehr nützliche Anleitung zur OO-Schnittstelle von matplotlib .
quelle
Nun, ich hatte große Probleme, die nicht blockierenden Befehle herauszufinden ... Aber schließlich gelang es mir, das Beispiel " Kochbuch / Matplotlib / Animationen - Ausgewählte Plotelemente animieren " zu überarbeiten , sodass es mit Threads funktioniert ( und Daten auch zwischen Threads
Pipe
weitergibt) über globale Variablen oder über einen Multiprozess ) unter Python 2.6.5 unter Ubuntu 10.04.Das Skript finden Sie hier: Animating_selected_plot_elements-thread.py - ansonsten unten eingefügt ( mit weniger Kommentaren ) als Referenz:
Hoffe das hilft jemandem,
Prost!
quelle
In vielen Fällen ist es bequemer, das Bild als PNG-Datei auf der Festplatte zu speichern. Hier ist warum:
Vorteile:
Nachteil:
quelle
Wenn Sie in der Konsole arbeiten, können
IPython
Sie dieseplt.show(block=False)
wie in den anderen Antworten angegeben verwenden. Aber wenn Sie faul sind, können Sie einfach Folgendes eingeben:Welches wird das gleiche sein.
quelle
Ich musste
plt.pause(0.001)
meinen Code auch ergänzen , damit er wirklich in einer for-Schleife funktioniert (andernfalls würde nur der erste und der letzte Plot angezeigt):quelle
Auf meinem System blockiert show () nicht, obwohl ich wollte, dass das Skript darauf wartet, dass der Benutzer mit dem Diagramm interagiert (und Daten mithilfe von 'pick_event'-Rückrufen sammelt), bevor ich fortfahre.
Um die Ausführung zu blockieren, bis das Plotfenster geschlossen wird, habe ich Folgendes verwendet:
Beachten Sie jedoch, dass canvas.start_event_loop_default () die folgende Warnung ausgegeben hat:
obwohl das Skript noch lief.
quelle
Ich wollte auch, dass meine Diagramme den Rest des Codes ausführen (und dann weiterhin angezeigt werden), auch wenn ein Fehler vorliegt (ich verwende manchmal Diagramme zum Debuggen). Ich habe diesen kleinen Hack so codiert, dass sich alle Handlungen in dieser
with
Anweisung als solche verhalten.Dies ist wahrscheinlich etwas zu unüblich und für den Produktionscode nicht ratsam. In diesem Code sind wahrscheinlich viele versteckte "Fallstricke" enthalten.
Wenn / wenn ich ein ordnungsgemäßes "Halten Sie die Diagramme offen (auch wenn ein Fehler auftritt) und das Anzeigen neuer Diagramme zulasse" implementiere, möchte ich, dass das Skript ordnungsgemäß beendet wird, wenn keine Benutzereingriffe dies anders angeben (für Stapelausführungszwecke).
Ich verwende möglicherweise eine Timeout-Frage "Ende des Skripts! \ NDrücken Sie p, wenn die Plotausgabe angehalten werden soll (Sie haben 5 Sekunden Zeit):" von /programming/26704840/corner -cases-for-my-wait-for-User-Input-Interruption-Implementierung .
quelle
quelle
Das OP fragt nach dem Entpacken von
matplotlib
Parzellen. Die meisten Antworten setzen die Befehlsausführung in einem Python-Interpreter voraus. Der hier vorgestellte Anwendungsfall ist meine Präferenz für das Testen von Code in einem Terminal (z. B. Bash), in dem a ausgeführtfile.py
wird, und Sie möchten, dass die Handlung (en) angezeigt werden, das Python-Skript jedoch abgeschlossen wird und zu einer Eingabeaufforderung zurückkehrt.Diese eigenständige Datei wird verwendet
multiprocessing
, um einen separaten Prozess zum Plotten von Daten mit zu startenmatplotlib
. Der Haupt-Thread wird mit demos._exit(1)
in diesem Beitrag erwähnten beendet . Dieos._exit()
Hauptkräfte verlassen das System, lassen denmatplotlib
untergeordneten Prozess jedoch lebendig und reagieren, bis das Plotfenster geschlossen wird. Es ist ein völlig separater Prozess.Dieser Ansatz ähnelt einer Matlab-Entwicklungssitzung mit Figurenfenstern, die eine reaktionsschnelle Eingabeaufforderung enthalten. Mit diesem Ansatz haben Sie jeglichen Kontakt zum Prozess des Figurenfensters verloren, aber das ist für die Entwicklung und das Debuggen in Ordnung. Schließen Sie einfach das Fenster und testen Sie weiter.
multiprocessing
ist für die reine Python-Codeausführung konzipiert, wodurch es möglicherweise besser geeignet ist alssubprocess
.multiprocessing
ist plattformübergreifend, daher sollte dies unter Windows oder Mac mit geringen oder keinen Anpassungen gut funktionieren. Das zugrunde liegende Betriebssystem muss nicht überprüft werden. Dies wurde unter Linux Ubuntu 18.04LTS getestet.Beim Ausführen
file.py
wird ein Figurenfenster geöffnet und dann beendet.__main__
Dasmultiprocessing
+matplotlib
Figurenfenster reagiert jedoch weiterhin mit Zoom-, Schwenk- und anderen Schaltflächen, da es sich um einen unabhängigen Vorgang handelt.Überprüfen Sie die Prozesse an der bash-Eingabeaufforderung mit:
ps ax|grep -v grep |grep file.py
quelle
.daemon=False
wie hier beschrieben stackoverflow.com/a/49607287/1476932 Dersys.exit()
übergeordnete Prozess wurde jedoch nicht wie dort beschrieben beendet, bis ich das untergeordnete Fenster geschlossen habe. Auf der anderen Seite hat die Verwendungos._exit(0)
aus dem obigen Beispiel funktioniert.Meiner Meinung nach bieten die Antworten in diesem Thread Methoden, die nicht für jedes System und in komplexeren Situationen wie Animationen funktionieren. Ich schlage vor, die Antwort von MiKTeX im folgenden Thread zu lesen , in dem eine robuste Methode gefunden wurde: Wie kann man warten, bis die matplotlib-Animation endet?
quelle
Wenn Sie mehrere Figuren öffnen möchten, während alle geöffnet bleiben, hat dieser Code für mich funktioniert:
quelle
Während ich die Anfrage des OP nicht direkt beantworte, poste ich diese Problemumgehung, da sie jemandem in dieser Situation helfen kann:
dafür benutze ich:
Wobei "var" das Diagramm in der Schleife identifiziert, damit es nicht überschrieben wird.
quelle
Verwenden Sie
plt.show(block=False)
und am Ende Ihres Skriptaufrufsplt.show()
.Dadurch wird sichergestellt, dass das Fenster nach Abschluss des Skripts nicht geschlossen wird.
quelle