Tengo problemas para volver a dibujar la figura aquí. Permito que el usuario especifique las unidades en la escala de tiempo (eje x) y luego recalculo y llamo a esta función plots()
. Quiero que la trama simplemente se actualice, no agregue otra trama a la figura.
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
el sobrenombre
fuente
fuente
Respuestas:
Básicamente tienes dos opciones:
Haz exactamente lo que estás haciendo actualmente, pero llama
graph1.clear()
ygraph2.clear()
antes de responder los datos. Esta es la opción más lenta, pero más simple y robusta.En lugar de responder, solo puede actualizar los datos de los objetos de la trama. Tendrá que hacer algunos cambios en su código, pero esto debería ser mucho, mucho más rápido que responder cada vez. Sin embargo, la forma de los datos que está trazando no puede cambiar, y si el rango de sus datos está cambiando, deberá restablecer manualmente los límites de los ejes xey.
Para dar un ejemplo de la segunda opción:
fuente
clear
? Debería llamargraph1.clear(); graph2.clear()
dentro de sufor
bucle, justo antes de llamargraph1.plot(...)
,graph2.plot(...)
etc ...fig.canvas.draw()
oplt.draw()
después de trazar cada fotograma? (Es decir, usted debe tener una secuencia declear
,plot
,draw
cada vez que se desea mostrar un cuadro) supongo, pero creo que causaría exactamente el comportamiento que describes ... Buena suerte, de todos modos!También puede hacer lo siguiente: Esto dibujará una matriz aleatoria de 10x1 en el gráfico durante 50 ciclos del ciclo for.
fuente
%matplotlib inline
en el cuaderno Jupyter también.plt.clf()
. Ohmatplotlib
, bribón :)Esto funcionó para mí. Llama repetidamente a una función que actualiza el gráfico cada vez.
"diversión" es una función que devuelve un número entero. FuncAnimation repetidamente llamará "actualizar", lo hará "xmax" veces.
fuente
En caso de que alguien encuentre este artículo buscando lo que estaba buscando, encontré ejemplos en
¿Cómo visualizar datos 2D escalares con Matplotlib?
y
http://mri.brechmos.org/2009/07/automatically-update-a-figure-in-a-loop (en web.archive.org)
luego los modificó para usar imshow con una pila de cuadros de entrada, en lugar de generar y usar contornos sobre la marcha.
Comenzando con una matriz 3D de imágenes de forma (nBins, nBins, nBins), llamadas
frames
.También encontré una forma mucho más simple de realizar todo este proceso, aunque menos robusta:
Tenga en cuenta que ambos parecen funcionar solo con
ipython --pylab=tk
, también conocido comobackend = TkAgg
Gracias por la ayuda con todo.
fuente
He lanzado un paquete llamado python-drawnow que proporciona funcionalidad para permitir que una figura se actualice, normalmente llamada dentro de un bucle for, similar a la de Matlab
drawnow
.Un ejemplo de uso:
Este paquete funciona con cualquier figura matplotlib y proporciona opciones para esperar después de cada actualización de la figura o caer en el depurador.
fuente
Todo lo anterior podría ser cierto, sin embargo, para mí, la "actualización en línea" de cifras solo funciona con algunos backends, específicamente
wx
. Puede intentar cambiar esto, por ejemplo, iniciando ipython / pylab poripython --pylab=wx
! ¡Buena suerte!fuente
Esto funcionó para mí:
fuente