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

> **
> Στις 23/01/2012 08:10 μμ, ο/η Benjamin Root έγραψε:
>
> 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
>
>   Ok,now it shows me only one figure but it's full of blue color and
> doesn't do anything.
> Thanks
>
> Actually, it's plotting your data correctly.  If you print out the values
of `mydata` in the `Graph` loop, you'll see that everything is zero.

-Tony
------------------------------------------------------------------------------
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