How to create a movie?? (from matlab code)

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, ex2).

-Tony

···

On Sat, Jan 21, 2012 at 9:07 AM, Gousios George <ggeo1@…83…3830…> 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!

Στις 21/01/2012 04:54 μμ, ο/η Tony Yu έγραψε:

      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 ,
ex2).

      -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.
···
    On Sat, Jan 21, 2012 at 9:07 AM, Gousios > George <ggeo1@...3830...> >         wrote:

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

···

On Sat, Jan 21, 2012 at 11:31 AM, Gousios George <ggeo1@…878…3830…> wrote:

Στις 21/01/2012 04:54 μμ, ο/η Tony Yu έγραψε:

    On Sat, Jan 21, 2012 at 9:07 AM, Gousios > > George <ggeo1@...3830...> > >         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 ,
ex2).

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

���� 21/01/2012 07:05 ��, �/� Tony Yu ������:

        ���� 21/01/2012 04:54

��, �/� Tony Yu ������:

                  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, ex2).

                  -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!
···
    On Sat, Jan 21, 2012 at 11:31 AM, Gousios > George <ggeo1@...3830...> >         wrote:
                On Sat, Jan 21, 2012 at 9:07 > > > AM, Gousios George <ggeo1@...3830...> > > >                     wrote: