2012/1/23 Gousios George <gg...@windowslive.com>

> **
> Στις 23/01/2012 07:48 μμ, ο/η Tony Yu έγραψε:
>
>
>
> 2012/1/23 Gousios George <gg...@windowslive.com>
>
>>  Στις 23/01/2012 06:52 μμ, ο/η Tony Yu έγραψε:
>>
>>
>>
>> 2012/1/23 Gousios George <gg...@windowslive.com>
>>
>>>  Στις 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...@windowslive.com>wrote:
>>>
>>>>  Στις 21/01/2012 04:54 μμ, ο/η Tony Yu έγραψε:
>>>>
>>>>
>>>>
>>>> On Sat, Jan 21, 2012 at 9:07 AM, Gousios George 
>>>> <gg...@windowslive.com>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
------------------------------------------------------------------------------
Try before you buy = See our experts in action!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-dev2
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to