Środowisko: Python 2.7, matplotlib 1.3, IPython notebook 1.1, linux, chrome. Kod znajduje się w jednej komórce wejściowej, używając--pylab=inline
Chcę używać notatnika IPython i pand, aby zużywać strumień i dynamicznie aktualizować wykres co 5 sekund.
Kiedy po prostu używam instrukcji print do drukowania danych w formacie tekstowym, działa to doskonale: komórka wyjściowa po prostu drukuje dane i dodaje nowe wiersze. Ale kiedy próbuję wykreślić dane (a następnie zaktualizować je w pętli), wykres nigdy nie pojawia się w komórce wyjściowej. Ale jeśli usunę pętlę, po prostu wykreśl ją raz. To działa dobrze.
Następnie zrobiłem prosty test:
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)
Wyjście nie pokaże niczego, dopóki ręcznie nie przerwę procesu (ctrl + m + i). Po przerwaniu wykres jest wyświetlany poprawnie jako wiele nakładających się linii. Ale to, czego naprawdę chcę, to wykres, który pojawia się i jest aktualizowany co 5 sekund (lub za każdym razem, gdy plot()
funkcja zostanie wywołana, tak jak to, co wypisuje instrukcja print, o której wspomniałem powyżej, która działa dobrze). Tylko pokazanie ostatecznego wykresu po całkowitym zakończeniu komórki NIE jest tym, czego chcę.
Próbowałem nawet jawnie dodać funkcję draw () po każdym plot()
itd. Żadna z nich nie działa. Zastanawiam się, jak dynamicznie aktualizować wykres za pomocą pętli for / while w jednej komórce w notatniku IPython.
źródło
clear_output(wait=True)
rozwiązuje ten problem. Zobacz odpowiedź wabu poniżej.%matplotlib nbagg
co daje ci żywą figurę do zabawy.nbagg
to osiągnąć. (Pinguje, jeśli jesteś zainteresowany odpowiedzią.) Stackoverflow.com/questions/34486642/ ...Możesz to ulepszyć, dodając
wait=True
doclear_output
:display.clear_output(wait=True) display.display(pl.gcf())
źródło
Kilka ulepszeń w odpowiedzi HYRY'ego :
display
wcześniejclear_output
, abyś skończył z jedną fabułą zamiast dwóch, gdy komórka zostanie przerwana.KeyboardInterrupt
, aby dane wyjściowe komórki nie były zaśmiecone śledzeniem.import matplotlib.pylab as plt import pandas as pd import numpy as np import time from IPython import display %matplotlib inline i = pd.date_range('2013-1-1',periods=100,freq='s') while True: try: plt.plot(pd.Series(data=np.random.randn(100), index=i)) display.display(plt.gcf()) display.clear_output(wait=True) time.sleep(1) except KeyboardInterrupt: break
źródło
display.display(gcf())
powinno iść PRZEDdisplay.clear_output(wait=True)
display
dzwonić wcześniejclear_output
? Nie powinieneś najpierw wyczyścić danych wyjściowych, a następnie wyświetlić nowe dane, zamiast robić to na odwrót?Spróbuj dodać funkcję
show()
lubgcf().show()
po niejplot()
. Wymusi to aktualizację bieżącej liczby (gcf () zwraca odniesienie do bieżącej figury).źródło
Dodanie etykiety do innych zamieszczonych tutaj rozwiązań spowoduje ciągłe dodawanie nowych etykiet w każdej pętli. Aby sobie z tym poradzić, wyczyść fabułę za pomocą
clf
for t in range(100) if t % refresh_rate == 0: plt.clf() plt.plot(history['val_loss'], 'r-', lw=2, label='val') plt.plot(history['training_loss'], 'b-', lw=1, label='training') plt.legend() display.clear_output(wait=True) display.display(plt.gcf())
źródło
plt.clf()
działa. Czy jest jednak sposób, aby pozbyć się migotania z aktualizacji?Możesz to zrobić w ten sposób. Przyjmuje x, y jako listę i wyświetla wykres punktowy oraz trend liniowy na tym samym wykresie.
from IPython.display import clear_output from matplotlib import pyplot as plt %matplotlib inline def live_plot(x, y, figsize=(7,5), title=''): clear_output(wait=True) plt.figure(figsize=figsize) plt.xlim(0, training_steps) plt.ylim(0, 100) x= [float(i) for i in x] y= [float(i) for i in y] if len(x) > 1: plt.scatter(x,y, label='axis y', color='k') m, b = np.polyfit(x, y, 1) plt.plot(x, [x * m for x in x] + b) plt.title(title) plt.grid(True) plt.xlabel('axis x') plt.ylabel('axis y') plt.show();
wystarczy zadzwonić
live_plot(x, y)
w pętli. Oto jak to wygląda:źródło