Umgebung: Python 2.7, Matplotlib 1.3, IPython Notebook 1.1, Linux, Chrome. Der Code befindet sich in einer einzelnen Eingabezelle mit--pylab=inline
Ich möchte IPython-Notebook und Pandas verwenden, um einen Stream zu konsumieren und alle 5 Sekunden einen Plot dynamisch zu aktualisieren.
Wenn ich nur die print-Anweisung verwende, um die Daten im Textformat zu drucken, funktioniert das einwandfrei: Die Ausgabezelle druckt einfach weiter Daten und fügt neue Zeilen hinzu. Wenn ich jedoch versuche, die Daten zu zeichnen (und sie dann in einer Schleife zu aktualisieren), wird der Plot nie in der Ausgabezelle angezeigt. Aber wenn ich die Schleife entferne, zeichne sie einfach einmal. Es funktioniert gut.
Dann habe ich einen einfachen Test gemacht:
i = pd.date_range('2013-1-1',periods=100,freq='s')
while True:
plot(pd.Series(data=np.random.randn(100), index=i))
#pd.Series(data=np.random.randn(100), index=i).plot() also tried this one
time.sleep(5)
Die Ausgabe zeigt nichts an, bis ich den Vorgang manuell unterbreche (Strg + m + i). Und nachdem ich es unterbrochen habe, wird das Diagramm korrekt als mehrere überlappende Linien angezeigt. Aber was ich wirklich will, ist ein Plot, der alle 5 Sekunden angezeigt und aktualisiert wird (oder wann immer die plot()
Funktion aufgerufen wird, genau wie die oben erwähnten Druckanweisungsausgaben, was gut funktioniert). Nur das endgültige Diagramm zu zeigen, nachdem die Zelle vollständig fertig ist, ist NICHT das, was ich will.
Ich habe sogar versucht, nach jeder explizit die Funktion draw () plot()
usw. hinzuzufügen . Keine davon funktioniert. Ich frage mich, wie ich einen Plot durch eine for / while-Schleife in einer Zelle im IPython-Notizbuch dynamisch aktualisieren kann.
quelle
clear_output(wait=True)
löst dieses Problem. Siehe Wabus Antwort unten.%matplotlib nbagg
dem Sie eine Live-Figur zum Spielen haben.nbagg
dies erreicht. (Pingen Sie an, falls Sie daran interessiert sind, darauf zu antworten.) Stackoverflow.com/questions/34486642/…Sie können dies weiter verbessern durch Zugabe
wait=True
zuclear_output
:quelle
Ein paar Verbesserungen an HYRYs Antwort :
display
vorher an,clear_output
damit Sie einen Plot anstelle von zwei erhalten, wenn die Zelle unterbrochen wird.KeyboardInterrupt
, damit die Zellenausgabe nicht mit dem Traceback übersät ist.quelle
display.display(gcf())
sollte gehen VORdisplay.clear_output(wait=True)
display
vorher angerufen werdenclear_output
? Sollten Sie nicht zuerst die Ausgabe löschen und dann die neuen Daten anzeigen, anstatt es umgekehrt zu tun?Versuchen Sie,
show()
odergcf().show()
nach derplot()
Funktion hinzuzufügen . Dadurch wird die Aktualisierung der aktuellen Abbildung erzwungen (gcf () gibt eine Referenz für die aktuelle Abbildung zurück).quelle
Durch Hinzufügen von Beschriftungen zu den anderen hier veröffentlichten Lösungen werden in jeder Schleife immer wieder neue Beschriftungen hinzugefügt. Um damit umzugehen, löschen Sie die Handlung mit
clf
quelle
plt.clf()
funktioniert. Gibt es jedoch trotzdem eine Möglichkeit, das Flimmern der Updates zu beseitigen?Sie können es so machen. Es akzeptiert x, y als Liste und gibt ein Streudiagramm sowie einen linearen Trend auf demselben Diagramm aus.
Sie müssen nur
live_plot(x, y)
innerhalb einer Schleife aufrufen . So sieht es aus:quelle