Ich habe Probleme beim Neuzeichnen der Figur hier. Ich erlaube dem Benutzer, die Einheiten in der Zeitskala (x-Achse) anzugeben, und dann berechne ich diese Funktion neu und rufe sie auf plots()
. Ich möchte, dass der Plot einfach aktualisiert wird und kein weiterer Plot an die Figur angehängt wird.
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
Der Nickname
quelle
quelle
Antworten:
Sie haben im Wesentlichen zwei Möglichkeiten:
Machen Sie genau das, was Sie gerade tun, aber rufen Sie an
graph1.clear()
undgraph2.clear()
bevor Sie die Daten neu plotten. Dies ist die langsamste, aber einfachste und robusteste Option.Anstatt neu zu zeichnen, können Sie einfach die Daten der Plotobjekte aktualisieren. Sie müssen einige Änderungen an Ihrem Code vornehmen, aber dies sollte viel, viel schneller sein, als jedes Mal Dinge neu zu zeichnen. Die Form der Daten, die Sie zeichnen, kann sich jedoch nicht ändern. Wenn sich der Bereich Ihrer Daten ändert, müssen Sie die Grenzwerte für die x- und y-Achse manuell zurücksetzen.
Um ein Beispiel für die zweite Option zu geben:
quelle
clear
? Sie sollten ingraph1.clear(); graph2.clear()
Ihrerfor
Schleife anrufen, kurz bevor Sie anrufengraph1.plot(...)
,graph2.plot(...)
etc ...fig.canvas.draw()
oderplt.draw()
nach dem Plotten jedes Frames? (Ie sollten Sie eine Folge von habenclear
,plot
,draw
jedes Mal , wenn Sie wollen , um einen Rahmen zeigen) Ich nehme an , aber ich denke , das würde dazu führen , genau das Verhalten Sie beschreiben ... Viel Glück, auf jeden Fall!Sie können auch Folgendes tun: Dadurch werden 10x1-Zufallsmatrixdaten für 50 Zyklen der for-Schleife auf dem Plot gezeichnet.
quelle
%matplotlib inline
in Jupyter Notizbuch.plt.clf()
. Ohmatplotlib
, du Schlingel :)Das hat bei mir funktioniert. Ruft wiederholt eine Funktion auf, die das Diagramm jedes Mal aktualisiert.
"fun" ist eine Funktion, die eine Ganzzahl zurückgibt. FuncAnimation ruft wiederholt "update" auf, dies geschieht "xmax" mal.
quelle
Für den Fall, dass jemand auf diesen Artikel stößt und nach dem sucht, wonach ich gesucht habe, habe ich Beispiele unter gefunden
Wie visualisiere ich skalare 2D-Daten mit Matplotlib?
und
http://mri.brechmos.org/2009/07/automatically-update-a-figure-in-a-loop (auf web.archive.org)
Ändern Sie sie dann so, dass sie imshow mit einem Eingabestapel von Frames verwenden, anstatt Konturen im laufenden Betrieb zu generieren und zu verwenden.
Beginnend mit einem 3D-Array von Formbildern (nBins, nBins, nBins), genannt
frames
.Ich habe auch einen viel einfacheren Weg gefunden, um diesen ganzen Prozess durchzuführen, wenn auch weniger robust:
Beachten Sie, dass beide nur funktionieren
ipython --pylab=tk
, auch bekannt alsbackend = TkAgg
Vielen Dank für die Hilfe bei allem.
quelle
Ich habe ein Paket namens python-drawow veröffentlicht , das Funktionen zum Aktualisieren einer Figur bietet, die normalerweise in einer for-Schleife aufgerufen werden, ähnlich wie bei Matlab
drawnow
.Ein Anwendungsbeispiel:
Dieses Paket funktioniert mit jeder matplotlib-Figur und bietet Optionen zum Warten nach jeder Figurenaktualisierung oder zum Ablegen im Debugger.
quelle
All dies mag zutreffen, aber für mich funktioniert die "Online-Aktualisierung" von Zahlen nur mit einigen Backends, insbesondere
wx
. Sie könnten versuchen, dies zu ändern, z. B. indem Sie ipython / pylab mit startenipython --pylab=wx
! Viel Glück!quelle
Das hat bei mir funktioniert:
quelle