Я собрал воедино этот код, который открывает куб данных и строит соответствующие изображения вдоль определенной оси в цикле.Куб 5D, но сохранен как 3d куб, где три последних димса упакованы следующим образом.idx = t*nw*ns + s*nw + w
с t, являющимся шагом по времени, s параметром Стокса и w длиной волны.Распаковать его и пройтись по нему легко, но когда я запускаю этот код некоторое время (> 5 с), он значительно замедляется, и если я держу его открытым более 20 секунд, он замораживает мой компьютер.
Я думаю, что это потому, что я должен очистить фигуру после перерисовки, но подпрограмме не нравится иметь какие-либо plt.clf () в главном цикле.Есть ли умный способ сделать это?
def animatecrisp(cube, dim, nw, nt, cut=50, t=0, s=0, w=0, ns=4):
fig = plt.figure()
'''
cubes are formated as an entire scan for one time and stokes.
Uses global vars: var, s, t, w, meanim, stdim
'''
#plot once to establish window
idx = t*nw*ns + s*nw + w
im = sl.get(cube,idx)[cut:-cut, cut:-cut]
global meanim, stdim #make global to use inside loop
meanim = np.mean(im)
stdim = np.std(im)
a = plt.imshow(im, vmax=meanim+2*stdim, vmin=meanim-2*stdim, cmap='gray', animated=True)
#Check which variable we are looping over
global var #make global to inside loop
var = 0
var_counter = 0
if dim == 't':
var_counter = nt
elif dim == 's':
var_counter = ns
elif dim == 'w':
var_counter = nw
else:
raise ValueError("Dim must be t,s or w.")
def updatefig(*args):
global var, s, t, w, meanim, stdim
var += 1
if var == var_counter:
var = 0
if dim == 't':
t = var
elif dim == 's':
s = var
elif dim == 'w':
w = var
else:
raise ValueError("Dim must be t,s or w.")
idx = t*nw*ns + s*nw + w
im = sl.get(cube,idx)[cut:-cut, cut:-cut]
meanim = np.mean(im)
stdim = np.std(im)
if mn==sd and mn==0:
a = plt.imshow(im, vmax=meanim+2*stdim, vmin=meanim-2*stdim, cmap='gray', animated=True)
else:
a = plt.imshow(im, vmax=mn+2*sd, vmin=mn-2*sd, cmap='gray', animated=True)
print(a,t,s,w, meanim, stdim)
return a,
ani = animation.FuncAnimation(fig, updatefig, fargs=(t,s,w), interval=50, blit=True)
plt.colorbar()
plt.show()