Environnement: Python 2.7, matplotlib 1.3, notebook IPython 1.1, linux, chrome. Le code est dans une seule cellule d'entrée, en utilisant--pylab=inline
Je souhaite utiliser le notebook IPython et les pandas pour consommer un flux et mettre à jour dynamiquement un tracé toutes les 5 secondes.
Lorsque j'utilise simplement une instruction d'impression pour imprimer les données au format texte, cela fonctionne parfaitement: la cellule de sortie continue simplement d'imprimer des données et d'ajouter de nouvelles lignes. Mais lorsque j'essaie de tracer les données (puis de les mettre à jour dans une boucle), le tracé n'apparaît jamais dans la cellule de sortie. Mais si je supprime la boucle, tracez-la une fois. Ça fonctionne bien.
Ensuite, j'ai fait un test simple:
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)
La sortie n'affichera rien tant que j'interromprai manuellement le processus (ctrl + m + i). Et après l'avoir interrompu, l'intrigue s'affiche correctement sous la forme de plusieurs lignes superposées. Mais ce que je veux vraiment, c'est un tracé qui s'affiche et qui est mis à jour toutes les 5 secondes (ou chaque fois que la plot()
fonction est appelée, tout comme les résultats de l'instruction d'impression que j'ai mentionnés ci-dessus, qui fonctionne bien). Ne montrer que le graphique final une fois la cellule terminée n'est PAS ce que je veux.
J'ai même essayé d'ajouter explicitement la fonction draw () après chacun plot()
, etc. Aucun d'eux ne fonctionne. Je me demande comment mettre à jour dynamiquement un tracé par une boucle for / while dans une cellule du notebook IPython.
la source
clear_output(wait=True)
résout ce problème. Voir la réponse de wabu ci-dessous.%matplotlib nbagg
ce qui vous donne une figurine en direct avec laquelle jouer.nbagg
pour y parvenir. (Ping vous au cas où vous seriez intéressé à y répondre.) Stackoverflow.com/questions/34486642/…Vous pouvez encore améliorer cela en ajoutant
wait=True
àclear_output
:la source
Quelques améliorations sur la réponse de HYRY :
display
avantclear_output
pour que vous vous retrouviez avec un tracé, plutôt que deux, lorsque la cellule est interrompue.KeyboardInterrupt
, de sorte que la sortie de la cellule ne soit pas jonchée de traceback.la source
display.display(gcf())
devrait aller AVANTdisplay.clear_output(wait=True)
display
être appelé avantclear_output
? Ne devriez-vous pas d'abord effacer la sortie, puis afficher les nouvelles données, au lieu de le faire dans l'autre sens?Essayez d'ajouter
show()
ougcf().show()
après laplot()
fonction. Cela forcera la mise à jour de la figure actuelle (gcf () renvoie une référence pour la figure actuelle).la source
L'ajout d'étiquettes aux autres solutions publiées ici continuera d'ajouter de nouvelles étiquettes dans chaque boucle. Pour résoudre ce problème, effacez l'intrigue en utilisant
clf
la source
plt.clf()
fonctionne. Cependant, est-il possible de se débarrasser du scintillement des mises à jour?Vous pouvez le faire comme ça. Il accepte x, y comme liste et génère un nuage de points plus une tendance linéaire sur le même graphique.
il vous suffit d'appeler à l'
live_plot(x, y)
intérieur d'une boucle. Voici à quoi ça ressemble:la source