Στις 23/01/2012 08:10 μμ, ο/η Benjamin Root έγραψε:
2012/1/23 Gousios George <gg...@windowslive.com <mailto:gg...@windowslive.com>>

    Στις 23/01/2012 07:48 μμ, ο/η Tony Yu έγραψε:


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

        Στις 23/01/2012 06:52 μμ, ο/η Tony Yu έγραψε:


        2012/1/23 Gousios George <gg...@windowslive.com
        <mailto: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 <mailto: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
                <mailto: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

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