|
From: Benjamin R. <ben...@ou...> - 2012-01-23 18:11:10
|
2012/1/23 Gousios George <gg...@wi...> > ** > Στις 23/01/2012 07:48 μμ, ο/η Tony Yu έγραψε: > > > > 2012/1/23 Gousios George <gg...@wi...> > >> Στις 23/01/2012 06:52 μμ, ο/η Tony Yu έγραψε: >> >> >> >> 2012/1/23 Gousios George <gg...@wi...> >> >>> Στις 21/01/2012 07:43 μμ, ο/η Gousios George έγραψε: >>> >>> Στις 21/01/2012 07:05 μμ, ο/η Tony Yu έγραψε: >>> >>> >>> >>> On Sat, Jan 21, 2012 at 11:31 AM, Gousios George <gg...@wi...>wrote: >>> >>>> Στις 21/01/2012 04:54 μμ, ο/η Tony Yu έγραψε: >>>> >>>> >>>> >>>> On Sat, Jan 21, 2012 at 9:07 AM, Gousios George <gg...@wi...>wrote: >>>> >>>>> Hello , i have the following code in matlab and trying to do it in >>>>> matplotlib. >>>>> >>>>> I have this code in matlab (in a function showGraphs): >>>>> ... >>>>> m = size(myList, 3); >>>>> for k = 1:m >>>>> g = myList(:, :, k); >>>>> image(g + 1) >>>>> axis off >>>>> axis square >>>>> M(k) = getframe; >>>>> end; >>>>> >>>>> and in another file (another function): >>>>> ... >>>>> M = showGraphs(grids) >>>>> movie(M, 1) >>>>> >>>>> >>>>> >>>>> I did so far: >>>>> >>>>> def showGraphs(data): >>>>> data=sc.array([data]) >>>>> n=sc.shape(data)[2] >>>>> for k in range(n): >>>>> mydata=data[:,:,k] >>>>> #plt.imshow(mydata+1) -->> this doesn't work >>>>> >>>>> Also ,in order to do the animation : >>>>> >>>>> grids=...(result from another function) >>>>> result=showGraph(grids) >>>>> fig=plt.figure() >>>>> ani=animation.FuncAnimation(fig,result,interval=30,blit=True) >>>>> plt.show() >>>>> >>>>> Right now the program says "TypeError: 'NoneType' object is not >>>>> callable" (it has errors in the animation call) >>>>> >>>>> What should be my approach to this in order to have the animation? >>>>> >>>>> Thank you! >>>>> >>>>> >>>> You're getting that error because the second argument to FuncAnimation >>>> (`result` in your example) should be a function (not always; see example 2 >>>> linked below). Right now, if your `showGraphs` function is defined in full, >>>> it returns a value of None, which gets saved to `result` (hence the error). >>>> >>>> You should take a look at some of the image animation examples (ex1<http://matplotlib.sourceforge.net/examples/animation/dynamic_image.html>, >>>> ex2<http://matplotlib.sourceforge.net/examples/animation/dynamic_image2.html> >>>> ). >>>> >>>> -Tony >>>> >>>> >>>> I did now : >>>> >>>> >>>> def showGraphs(data): >>>> data=sc.array([data]) >>>> n=sc.shape(data)[2] >>>> ims=[] >>>> >>>> for k in range(n): >>>> mydata=data[:,:,k] >>>> im=plt.imshow(mydata+1) >>>> ims.append([im]) >>>> return ims >>>> >>>> and now it gives me "TypeError: Invalid dimensions for image data. >>>> >>>> >>> Please post short, but executable examples when possible. I'm not sure >>> what your data looks like, but your call to `sc.array` is strange (I'm not >>> sure why you have square brackets, which effectively adds an unnecessary >>> dimension to your data). >>> >>> The code attached below should work. >>> >>> Cheers, >>> -Tony >>> >>> import numpy as np >>> import matplotlib.pyplot as plt >>> from matplotlib.animation import ArtistAnimation >>> >>> >>> fig = plt.figure() >>> >>> def showGraphs(data): >>> data = np.asarray(data) # unnecessary in this example >>> n = np.shape(data)[2] >>> >>> ims = [] >>> #for mydata in np.rollaxis(data, -1): >>> for k in range(n): >>> mydata = data[:, :, k] >>> im = plt.imshow(mydata) >>> ims.append([im]) >>> return ims >>> >>> # 5 frames of a random 20 x 20 image >>> data = np.random.uniform(size=(20, 20, 5)) >>> ims = showGraphs(data) >>> >>> ani = ArtistAnimation(fig, ims) >>> plt.show() >>> >>> Now,it gives me 2 figures (why 2?) but empty.(maybe i didn't convert >>> right the matlab code below?) >>> The data in the showGraphs function is the result from this function (in >>> matlab): >>> ......... >>> grids = zeros(n, n, t + 1); >>> grids(:, :, 1) = rest; >>> for i = 2:(t + 1) >>> Extended = extendLat1(rest); >>> rest = applyExtended(Extended); >>> grids(:, :, i) = rest; >>> end; >>> >>> And i did this in python: >>> >>> grids=sc.zeros((area,area,t+1)) >>> rest=grids[:,:,0] >>> for i in range(1,t): >>> extended=extend(rest) >>> rest=apply_extend(extended) >>> grids[:,:,i]=rest >>> return grids >>> >>> Thanks for helping! >>> >>> Any help?Thanks! >>> >>> Sorry, but could you be a bit clearer: >> * Did the example I provide work for you? >> * Assuming it did, are you essentially replacing `data` in my example >> with `grids` in this most recent example? >> * I don't get 2 figures: are you asking about the code from my last >> message? >> * Please provide a minimal, *executable* example >> >> -Tony >> >> Ok,i 'll try! >> >> 1) Yes,your example works fine. >> 2) Yes,i return grids from another function (work) doing : >> >> grids=work(area,...,time) >> result=showGraphs(grids) >> ani=ArtistAnimation(fig,result) >> plt.show() >> >> The contents of the work function are shown above. >> I just want to make sure that i have done the conversion from matlab >> right. >> Maybe the problem is somewhere else? >> >> Thank you. >> >> > Did you get 2 figures with my original example, or just in your modified > code? If it's only in your modified code, then there's something you're not > showing which is creating the extra figure. > > Unfortunately, the `work` function you showed in the previous message is > not executable (`apply_extend`, `extend`, etc. aren't defined), which it > makes it very difficult to debug. If my code snippet worked for you, then > the only difference is in how you've defined `grids`---do you know how it's > different? > > -Tony > > > Ok,i am sending you the whole code of the program. (forget the names of > the functions i showed you so far , i use other names). > > EMPTY=0 #empty cell > TREE=1 #tree cell > BURNING=2 #burning cell > probTree=0.8 #probability of tree > probBurning=0.001 #a tree ignites with this probability even if no > neighbor is burning > probLighting=0.0001 #chance that a tree been hit from light > probResistBurn=0.3 #chance that a tree does not burn even if it's > neighbor burns > t=20 > area=50 > > > def spread(cell,N,E,S,W): > > if cell==EMPTY: > return EMPTY > elif cell==BURNING: > return EMPTY > else: > if (N==BURNING or E==BURNING or S==BURNING or W==BURNING): > if (sc.rand()<probResistBurn): > return TREE > else: > return BURNING > elif (sc.rand()<probLighting *(1-probResistBurn)): > return BURNING > else: > return TREE > > def extend(lat): > lat = sc.matrix(lat) > extendRows= sc.vstack([lat[-1,:], lat, lat[0,:]]) > extendLat=sc.hstack([extendRows[:,-1], extendRows, extendRows[:,0]]) > return extendLat > > def apply_extend(matr): > #matr = sc.matrix(matr) > matr=sc.array([matr]) > area=sc.shape(matr)[0] > final=sc.zeros((area,area)) > for i in range(1,area): > for j in range(1,area): > cell=matr[i,j] > N=matr[i-1,j] > E=matr[i,j+1] > S=matr[i+1,j] > W=matr[i,j-1] > final[i-1,j-1]=spread(cell,N,E,S,W) > return final > > def fire(area,probTree,probBurning,probLighting,probResistBurn,t): > > trees_or_burns=sc.rand(area,area)<probTree # tree or a burning tree > burns=trees_or_burns*(sc.rand(area,area)<probBurning) # burning tree > trees=trees_or_burns-burns # tree > empties=sc.ones((area,area))-trees_or_burns # empty cell > > forest=empties*EMPTY + trees*TREE + burns*BURNING #the whole forest > > grids=sc.zeros((area,area,t+1)) > forest=grids[:,:,0] > for i in range(1,): > extended_forest=extend(forest) > forest=apply_extend(extended_forest) > grids[:,:,i]=forest > return grids > > def Graph(data): > data=sc.array(data) > n=sc.shape(data)[2] > ims=[] > for i in range(n): > mydata=data[:,:,i] > im=plt.imshow(mydata) > > ims.append([im]) > return ims > > > if __name__=="__main__": > grids=fire(area,probTree,probBurning,probLighting,probResistBurn,t) > result=Graph(grids) > fig=plt.figure() > > #ani=animation.FuncAnimation(fig,result,interval=30,blit=True,repeat_delay=1000) > ani=ArtistAnimation(fig,result) > plt.show() > > Also, i am sending you the code in matlab : > > > In Graph(), you call "plt.imshow()", which will create a new figure automatically if one doesn't exist already. Change fig=plt.figure() to fig=plt.gcf() Ben Root |