python - font - ¿Cómo actualizar una parcela en matplotlib?
matplotlib title position (7)
En caso de que alguien se encuentre con 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 marcos de entrada, en lugar de generar y usar contornos sobre la marcha.
Comenzando con una matriz tridimensional de imágenes de forma (nBins, nBins, nBins), llamadas frames
.
def animate_frames(frames):
nBins = frames.shape[0]
frame = frames[0]
tempCS1 = plt.imshow(frame, cmap=plt.cm.gray)
for k in range(nBins):
frame = frames[k]
tempCS1 = plt.imshow(frame, cmap=plt.cm.gray)
del tempCS1
fig.canvas.draw()
#time.sleep(1e-2) #unnecessary, but useful
fig.clf()
fig = plt.figure()
ax = fig.add_subplot(111)
win = fig.canvas.manager.window
fig.canvas.manager.window.after(100, animate_frames, frames)
También encontré una manera mucho más simple de llevar a cabo todo este proceso, aunque menos robusto:
fig = plt.figure()
for k in range(nBins):
plt.clf()
plt.imshow(frames[k],cmap=plt.cm.gray)
fig.canvas.draw()
time.sleep(1e-6) #unnecessary, but useful
Tenga en cuenta que ambos parecen funcionar solo con ipython --pylab=tk
, aka backend = TkAgg
Gracias por la ayuda con todo.
Tengo problemas para volver a dibujar la figura aquí. Permito al usuario especificar las unidades en la escala de tiempo (eje x) y luego recalculo y llamo a esta función plots()
. Quiero que el argumento simplemente actualice, no agregue otro diagrama 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)
Esto funcionó para mí. Repetidamente llama a una función actualizando el gráfico cada vez.
import matplotlib.pyplot as plt
import matplotlib.animation as anim
def plot_cont(fun, xmax):
y = []
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
def update(i):
yi = fun()
y.append(yi)
x = range(len(y))
ax.clear()
ax.plot(x, y)
print i, '': '', yi
a = anim.FuncAnimation(fig, update, frames=xmax, repeat=False)
plt.show()
"diversión" es una función que devuelve un número entero. FuncAnimation repetidamente llamará "actualización", hará ese "xmax" veces.
He lanzado un paquete llamado python-drawnow que proporciona funcionalidad para permitir actualizar una figura, normalmente llamada dentro de un bucle for, similar al drawnow
de Matlab.
Un ejemplo de uso:
from pylab import figure, plot, ion, linspace, arange, sin, pi
def draw_fig():
# can be arbitrarily complex; just to draw a figure
#figure() # don''t call!
plot(t, x)
#show() # don''t call!
N = 1e3
figure() # call here instead!
ion() # enable interactivity
t = linspace(0, 2*pi, num=N)
for i in arange(100):
x = sin(2 * pi * i**2 * t / 100.0)
drawnow(draw_fig)
Este paquete funciona con cualquier figura de matplotlib y proporciona opciones para esperar después de cada actualización de figura o caer en el depurador.
También puede hacer lo siguiente: Esto dibujará datos de matriz aleatoria de 10x1 en la gráfica para 50 ciclos del bucle for.
import matplotlib.pyplot as plt
import numpy as np
plt.ion()
for i in range(50):
y = np.random.random([10,1])
plt.plot(y)
plt.draw()
plt.pause(0.0001)
plt.clf()
Todo lo anterior puede ser cierto, sin embargo, para mí la "actualización en línea" de las cifras solo funciona con algunos backends, específicamente wx
. Puede tratar de cambiar a esto, por ejemplo, al iniciar ipython / pylab por ipython --pylab=wx
! ¡Buena suerte!
Usted esencialmente tiene dos opciones:
Haga exactamente lo que está haciendo actualmente, pero llame a
graph1.clear()
ygraph2.clear()
antes de volver a copiar los datos. Esta es la opción más lenta, pero más simple y más robusta.En lugar de redirigir, 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 repetir las cosas todo el tiempo. Sin embargo, la forma de los datos que está trazando no puede cambiar, y si el rango de sus datos está cambiando, tendrá que restablecer manualmente los límites del eje xey.
Para dar un ejemplo de la segunda opción:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 6*np.pi, 100)
y = np.sin(x)
# You probably won''t need this if you''re embedding things in a tkinter plot...
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
line1, = ax.plot(x, y, ''r-'') # Returns a tuple of line objects, thus the comma
for phase in np.linspace(0, 10*np.pi, 500):
line1.set_ydata(np.sin(x + phase))
fig.canvas.draw()
fig.canvas.flush_events()
import csv
import sys
import getopt
import socket
import time
import numpy as np
import matplotlib
from scipy.misc import imread
from matplotlib import pyplot as plt
import warnings
fig, ax = plt.subplots()
ax.set_xlim(-158, 553)
ax.set_ylim(-290, 733)
im = plt.imread("")
plt.imshow(img, zorder=0, extent=[0.5, 8.0, 1.0, 7.0])
fig.show()
l_global=[]
points=[]
master_tag_csvlink=''c:/logfolde.log.csv''
csvfile=open(master_tag_csvlink, ''r'')
for ainfo in csvfile:
line= ainfo
l_list= list(line.split(''_''))
l_local=[]
for i in range(int(l_list[0])):
l_local.append(list(l_list[i+1].split('','')))
function1= lambda x,i: x[i] # return list[n,X] of elements at x
c= lambda x,l: [x for i in range(l) if True]
for i in range(len(l_local)):
l_local[i][1],l_local[i][2]=int(l_local[i][1]),int(l_local[i][2])
if l_global: #In begining l_glocal is empty, so just copy the data in to l_global
l_global=l_local[:]
for i in range(len(l_global)):
points.append(plt.plot(function1(l_global[i],1),function1(l_global[i],2),''g'',label="Tag:%s, X:%f, y: %f"%(function1(l_global[i],0),function1(l_global[i],1),function1(l_global[i],2))))
else: # compare the l_local & l_global for any updates
tag_Id=map(function1,l_local,c(0,len(l_local))) #list of list of tagId,x,y TagId is filtered - local
mTag_Id=map(fuction1,l_global,c(0,len(l_global))) #list of list of tagId,x,y TagId is filtered - master
for i in mTag_Id:
if i not in tag_Id: #comparing master tags and tag_Id''s
index=mTag_Id.index(i) ############### Tags in master list but not in Tag_id
copy_point=l_global[index]
[removing_point]=points[index]######## means tag is in-active ,turn tag color into red
removing_point.remove()
del points[index]
points.insert(index,plt.plot(function1(l_global[index],1),function1(l_global[index],2),''r'',label="Tag:%s, X:%f, y: %f"%(function1(l_global[i],0),function1(l_global[i],1),function1(l_global[i],2))))
elif i in tag_Id: # append the tag into l_global
index=mTag_Id.index(i) ############### Tags in master list but not in Tag_id
l_global[index]=l_local[index][:]
[removing_point]=points[index]######## means tag is active update coordinates
removing_point.remove()
del points[index]
points.insert(index,plt.plot(function1(l_global[index],1),function1(l_global[index],2),''g'',label="Tag:%s, X:%f, y: %f"%(function1(l_global[i],0),function1(l_global[i],1),function1(l_global[i],2))))
for i in Tag_Id:
if i not in mTag_Id:
index=Tag_Id(i)
l_global.append(l_local[index]]
points.append(plt.plot(function1(l_global[-1],1),function1(l_global[-1],2),''g'',label="Tag:%s, X:%f, y: %f"%(function1(l_global[i],0),function1(l_global[i],1),function1(l_global[i],2))))
# import matplotlib.pyplot as plt
# import numpy as np
# x = np.linspace(0, 6*np.pi, 100)
# y = np.sin(x)
# # You probably won''t need this if you''re embedding things in a tkinter plot...
# plt.ion()
# fig = plt.figure()
# ax = fig.add_subplot(11)1
# line1, = ax.plot(x, y, ''r-'') # Returns a tuple of line objects, thus the comma
# for phase in np.linspace(0, 10*np.pi, 500):
# line1.set_ydata(np.sin(x + phase))
# fig.canvas.draw()