Mam problemy z przerysowaniem rysunku tutaj. Pozwalam użytkownikowi określić jednostki w skali czasu (oś x), a następnie ponownie obliczam i wywołuję tę funkcję plots()
. Chcę, aby działka po prostu się zaktualizowała, a nie dodawała kolejną fabułę do figury.
def plots():
global vlgaBuffSorted
cntr()
result = collections.defaultdict(list)
for d in vlgaBuffSorted:
result[d['event']].append(d)
result_list = result.values()
f = Figure()
graph1 = f.add_subplot(211)
graph2 = f.add_subplot(212,sharex=graph1)
for item in result_list:
tL = []
vgsL = []
vdsL = []
isubL = []
for dict in item:
tL.append(dict['time'])
vgsL.append(dict['vgs'])
vdsL.append(dict['vds'])
isubL.append(dict['isub'])
graph1.plot(tL,vdsL,'bo',label='a')
graph1.plot(tL,vgsL,'rp',label='b')
graph2.plot(tL,isubL,'b-',label='c')
plotCanvas = FigureCanvasTkAgg(f, pltFrame)
toolbar = NavigationToolbar2TkAgg(plotCanvas, pltFrame)
toolbar.pack(side=BOTTOM)
plotCanvas.get_tk_widget().pack(side=TOP)
python
matplotlib
tkinter
pseudonim
źródło
źródło
Odpowiedzi:
Zasadniczo masz dwie opcje:
Zrób dokładnie to, co aktualnie robisz, ale zadzwoń
graph1.clear()
igraph2.clear()
przed ponownym przesłaniem danych. To najwolniejsza, ale najprostsza i najbardziej niezawodna opcja.Zamiast przesuwać, możesz po prostu zaktualizować dane obiektów wydruku. Będziesz musiał wprowadzić pewne zmiany w swoim kodzie, ale powinno to być dużo, dużo szybsze niż ponowne przesyłanie rzeczy za każdym razem. Jednak kształt danych, które wykreślasz, nie może się zmienić, a jeśli zakres danych się zmienia, musisz ręcznie zresetować granice osi x i y.
Aby podać przykład drugiej opcji:
źródło
clear
? Powinieneśgraph1.clear(); graph2.clear()
sprawdzać w swojejfor
pętli, tuż przed tym, jak zadzwoniszgraph1.plot(...)
,graph2.plot(...)
itd ...fig.canvas.draw()
lubplt.draw()
po wykreśleniu każdej klatki? (Tj trzeba mieć sekwencjęclear
,plot
,draw
za każdym razem chcesz pokazać ramkę) Zgaduję, ale myślę, że spowodowałoby dokładnie zachowanie jesteś opisujące ... powodzenia w każdym razie!Możesz również wykonać następujące czynności: Spowoduje to narysowanie losowych danych macierzowych 10x1 na wykresie dla 50 cykli pętli for.
źródło
%matplotlib inline
zeszyt Jupyter.plt.clf()
. Ochmatplotlib
,To zadziałało dla mnie. Wielokrotnie wywołuje funkcję aktualizującą wykres za każdym razem.
„fun” to funkcja zwracająca liczbę całkowitą. FuncAnimation będzie wielokrotnie wywoływać „update”, zrobi to „xmax” razy.
źródło
Na wypadek, gdyby ktoś natknął się na ten artykuł i szukał tego, czego szukałem, przykłady znalazłem pod adresem
Jak wizualizować skalarne dane 2D za pomocą Matplotlib?
i
http://mri.brechmos.org/2009/07/automatically-update-a-figure-in-a-loop (na web.archive.org)
następnie zmodyfikował je tak, aby używały imshow z wejściowym stosem ramek, zamiast generować i używać konturów w locie.
Zaczynając od tablicy 3D obrazów kształtu (nBins, nBins, nBins) o nazwie
frames
.Znalazłem również znacznie prostszy sposób na wykonanie całego procesu, choć mniej solidny:
Zauważ, że oba z nich wydają się działać tylko z
ipython --pylab=tk
, akabackend = TkAgg
Dziękuję za pomoc we wszystkim.
źródło
Wydałem pakiet o nazwie python-drawnow, który zapewnia funkcjonalność umożliwiającą aktualizację figury, zwykle wywoływaną w pętli for, podobnie jak w Matlabie
drawnow
.Przykładowe użycie:
Ten pakiet działa z każdą figurą matplotlib i zapewnia opcje czekania po każdej aktualizacji figury lub umieszczenia w debugerze.
źródło
Wszystko to może być prawdą, jednak dla mnie „aktualizacja online” danych działa tylko z niektórymi backendami, szczególnie
wx
. Możesz po prostu spróbować to zmienić, np. Uruchamiając ipython / pylab przezipython --pylab=wx
! Powodzenia!źródło
To zadziałało dla mnie:
źródło