|
From: Gousios G. <gg...@wi...> - 2012-01-23 18:05:41
|
Στις 23/01/2012 07:48 μμ, ο/η Tony Yu έγραψε: > > > 2012/1/23 Gousios George <gg...@wi... > <mailto:gg...@wi...>> > > Στις 23/01/2012 06:52 μμ, ο/η Tony Yu έγραψε: >> >> >> 2012/1/23 Gousios George <gg...@wi... >> <mailto: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... <mailto:gg...@wi...>> wrote: >>>> >>>> Στις 21/01/2012 04:54 μμ, ο/η Tony Yu έγραψε: >>>>> >>>>> >>>>> On Sat, Jan 21, 2012 at 9:07 AM, Gousios George >>>>> <gg...@wi... <mailto: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 : |