2013-07-25 13 views
6

Pracuję nad analizą obrazu i chcę utworzyć animację ostatecznych wyników, która zawiera sekwencję czasową danych 2D i wykres sekwencji czasowych w jednym pikselu, tak, że aktualizacja 1D jest aktualizowana w miarę postępu animacji 2D. Następnie ustaw je w subpocie obok siebie. Poniższy link ma obraz końcowego efektu, który najlepiej byłoby animować.Animacja z użyciem matplotlib z subplots i ArtistAnimation

enter image description here

Wciąż dostaję błąd: AttributeError: 'list' obiekt ma atrybut 'set_visible'. Przeszukałem go (tak jak to robię) i natknąłem się na http://matplotlib.1069221.n5.nabble.com/Matplotlib-1-1-0-animation-vs-contour-plots-td18703.html, gdzie jeden facet przebija kod, aby ustawić atrybut set_visible. Niestety polecenie fabuły nie ma takiego atrybutu, więc nie mam pojęcia, w jaki sposób mogę wyprodukować animację. Załączam łatkę małpie w poniższym minimalnym przykładzie roboczym (skomentowałem), a także drugi "im2", który jest również komentowany, który powinien działać dla każdego, kto próbuje uruchomić kod. Oczywiście da ci dwie animacje fabularne 2D. Minimal przykładem pracy jest następujący:

#!/usr/bin/env python 

import matplotlib.pyplot as plt 
import matplotlib.animation as anim 
import numpy as np 
import types 

#create image with format (time,x,y) 
image = np.random.rand(10,10,10) 
image2 = np.random.rand(10,10,10) 

#setup figure 
fig = plt.figure() 
ax1=fig.add_subplot(1,2,1) 
ax2=fig.add_subplot(1,2,2) 

#set up list of images for animation 
ims=[] 
for time in xrange(np.shape(image)[1]): 
    im = ax1.imshow(image[time,:,:]) 
# im2 = ax2.imshow(image2[time,:,:]) 
    im2 = ax2.plot(image[0:time,5,5]) 
# def setvisible(self,vis): 
#  for c in self.collections: c.set_visible(vis) 
# im2.set_visible = types.MethodType(setvisible,im2,None) 
# im2.axes = plt.gca() 

    ims.append([im, im2]) 

#run animation 
ani = anim.ArtistAnimation(fig,ims, interval=50,blit=False) 
plt.show() 

Byłem też ciekaw, czy ktoś wiedział o chłodnym sposób podkreślenia piksel, że dane 1D jest wyodrębniony z, lub nawet narysować linię od piksela do najbardziej prawy podplot, aby były w pewien sposób "połączone".

Adrian

+1

Losowa wskazówka, można użyć 'rys, (ax1, ax2) = plt.subplots (1, 2)', aby zapisać dwie linie – Mark

Odpowiedz

15

plot zwraca listę artystów (stąd dlaczego błąd odnosi się do listy). Dzięki temu możesz zadzwonić pod numer plot, np. lines = plot(x1, y1, x2, y2,...).

Zmień

im2 = ax2.plot(image[0:time,5,5]) 

do

im2, = ax2.plot(image[0:time,5,5]) 

dodanie przecinka UN-Pack długości jednej listy w im2

co do ciebie pytanie drugie, staramy się mieć tylko jedno pytanie za Wątek na SO, więc proszę otworzyć nowe pytanie.

+2

Nie wiem na temat autora origonal, ale to była świetna odpowiedź dla mnie. Twoje zdrowie. – dmon