4

I have calculated some results and they are in the form of 64x64 arrays. Each array is created some time after the other. I want to show these arrays one after the other, like an animation. I have tried many ways, and got none to work. Im am quite frustrated and the questions on SO regarding animations have not been able to help me get this to work. This is not the first time I try this, every time my result is the same though: I have never gotten this to work.

The approaches I have tried:

dynamic image

dynamic image 2

simple animation

The current code I have:

fig, ax = plt.subplots()
def animate(i):
    return imagelist[i] 
def init():
    fig.set_data([],[])
    return fig
ani = animation.FuncAnimation(fig, animate, np.arange(0, 19), init_func=init,
interval=20, blit=True)
plt.show()

Here imagelist is a list of the arrays I mention above (length 20, 0 through 19). My question is how can I get this to work?

6
  • The first link in your question contains the answer. I am confused by what you are asking. Commented Sep 11, 2013 at 14:38
  • For me it does not contain the answer. I first tried doing exactly what that first link said. But couldnt get it to work. Never understood what I did wrong. So now Im asking, what am I doing wrong, this is the places ive looked but I still dont get it. Commented Sep 11, 2013 at 14:42
  • Does the code at that link work unchanged? Commented Sep 11, 2013 at 14:49
  • and what errors does your code give you? Commented Sep 11, 2013 at 14:50
  • Well with the code as above it gives me AttributeError: 'Figure' object has no attribute 'set_data' But I have changed this so many times I think Ive seen pretty much all errors. Commented Sep 11, 2013 at 15:20

3 Answers 3

8

Copying almost exactly from your first link (and adding some comments):

hmpf = ones([4,4])
hmpf[2][1] = 0
imagelist = [ hmpf*i*255./19. for i in range(20) ]

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig = plt.figure() # make figure

# make axesimage object
# the vmin and vmax here are very important to get the color map correct
im = plt.imshow(imagelist[0], cmap=plt.get_cmap('jet'), vmin=0, vmax=255)

# function to update figure
def updatefig(j):
    # set the data in the axesimage object
    im.set_array(imagelist[j])
    # return the artists set
    return [im]
# kick off the animation
ani = animation.FuncAnimation(fig, updatefig, frames=range(20), 
                              interval=50, blit=True)
plt.show()

This animates as I expect

Sign up to request clarification or add additional context in comments.

10 Comments

So I dont need an init function? This runs without errors, however I dont see an animation, just the first image.
try removing blit=True
does it show and animation for you? I only see the first image. hmpf = ones([4,4]), hmpf[2][1] = 0, imagelist = [ hmpf*i*255./19. for i in range(20) ] creates a list of arrays you can use.
(python3 not sure for 2): You MUST assign animation.FuncAnimation to a variable. Removing ani = will make the animation not be executed.
I get "'AxesImage' object is not iterable" and "Exception in Tkinter callback" with the code provided, but this is fixed by modifying updatefig to return [im] instead of im.
|
4

Are you running in an interactive python session in Spyder? If so, you may need to run

    %matplotlib qt

To make sure that the animation opens in its own window, rather than being displayed inline (it doesn't work inline).

Also, make sure that you are not falling for the calling animation.FuncAnimation inside a function issue

Comments

3

I implemented a handy script that just suits your need. Try it out here

For your example:

imagelist = YOUR-IMAGE-LIST
def redraw_fn(f, axes):
    img = imagelist[f]
    if not redraw_fn.initialized:
        redraw_fn.im = axes.imshow(img, animated=True)
        redraw_fn.initialized = True
    else:
        redraw_fn.im.set_array(img)
redraw_fn.initialized = False

videofig(len(imagelist), redraw_fn, play_fps=30)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.