Ich mache eine Anwendung in Python, die Daten von einer seriellen Schnittstelle sammelt und ein Diagramm der gesammelten Daten gegen die Ankunftszeit zeichnet. Die Ankunftszeit für die Daten ist ungewiss. Ich möchte, dass der Plot aktualisiert wird, wenn Daten empfangen werden. Ich suchte danach und fand zwei Methoden:
- Löschen Sie den Plot und zeichnen Sie den Plot mit allen Punkten erneut.
- Animieren Sie das Diagramm, indem Sie es nach einem bestimmten Intervall ändern.
Ich bevorzuge nicht die erste, da das Programm läuft und Daten für eine lange Zeit sammelt (zum Beispiel einen Tag), und das Neuzeichnen des Plots wird ziemlich langsam sein. Der zweite ist ebenfalls nicht vorzuziehen, da der Zeitpunkt des Eintreffens der Daten ungewiss ist und ich möchte, dass der Plot nur aktualisiert wird, wenn die Daten empfangen werden.
Gibt es eine Möglichkeit, das Diagramm zu aktualisieren, indem ich nur dann weitere Punkte hinzufüge, wenn die Daten empfangen werden?
quelle
Antworten:
Abhängig von Ihrer Version gibt es verschiedene Möglichkeiten, Daten in matplotlib zu animieren. Haben Sie die Beispiele für das Matplotlib-Kochbuch gesehen ? Schauen Sie sich auch die moderneren Animationsbeispiele in der matplotlib-Dokumentation an. Schließlich definiert die Animations-API eine Funktion FuncAnimation, die eine Funktion rechtzeitig animiert. Diese Funktion kann nur die Funktion sein, mit der Sie Ihre Daten erfassen.
Jede Methode legt im Grunde die
data
Eigenschaft des zu zeichnenden Objekts fest, sodass weder der Bildschirm noch die Abbildung gelöscht werden müssen. Diedata
Eigenschaft kann einfach erweitert werden, sodass Sie die vorherigen Punkte beibehalten und Ihre Linie (oder Ihr Bild oder was auch immer Sie zeichnen) weiter ergänzen können.Angesichts der Tatsache, dass Sie sagen, dass Ihre Datenankunftszeit ungewiss ist, besteht Ihre beste Wahl wahrscheinlich darin, Folgendes zu tun:
Wenn Sie dann Daten von der seriellen Schnittstelle empfangen, rufen Sie einfach an
update_line
.quelle
Um dies ohne FuncAnimation zu tun (z. B. wenn Sie andere Teile des Codes ausführen möchten, während der Plot erstellt wird, oder wenn Sie mehrere Plots gleichzeitig aktualisieren möchten), rufen Sie auf
draw
der Plot allein durch nicht erzeugt (zumindest mit dem qt Backend).Folgendes funktioniert für mich:
quelle
%matplotlib notebook
Befehl magic nach Ihrer matplotlib-Importanweisung hinzufügen .Hier ist eine Möglichkeit, Punkte nach einer bestimmten Anzahl gezeichneter Punkte zu entfernen:
quelle
Ich weiß, dass ich zu spät bin, um diese Frage zu beantworten, aber für Ihr Problem könnten Sie sich das "Joystick" -Paket ansehen. Ich habe es zum Plotten eines Datenstroms von der seriellen Schnittstelle entwickelt, aber es funktioniert für jeden Stream. Es ermöglicht auch die interaktive Textprotokollierung oder Bilddarstellung (zusätzlich zur grafischen Darstellung). Sie müssen keine eigenen Schleifen in einem separaten Thread erstellen, das Paket kümmert sich darum. Geben Sie einfach die gewünschte Aktualisierungshäufigkeit an. Außerdem bleibt das Terminal für die Überwachung von Befehlen während des Plots verfügbar. Siehe http://www.github.com/ceyzeriat/joystick/ oder https://pypi.python.org/pypi/joystick (verwenden Sie den Pip-Installations-Joystick zur Installation).
Ersetzen Sie einfach np.random.random () durch Ihren realen Datenpunkt, der von der seriellen Schnittstelle im folgenden Code gelesen wird:
quelle