Search code examples
pythonmatplotlibmatplotlib-basemapmatplotlib-animation

Show only one frame at a time using matplotlib.animation.FuncAnimation


I've got some code similar to this

from matplotlib import animation
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

def animate(i):
    x0,y0 = np.random.random(size=(2,))*4-2
    x = np.random.normal(loc=x0, size=(1000,))
    y = np.random.normal(loc=y0, size=(1000,))

    for layer in prevlayers:
        layer.remove()
    prevlayers[:] = []

    hexlayer = ax.hexbin(x,y, gridsize=10, alpha=0.5)
    # the following line is needed in my code
    hexlayer.remove()
    prevlayers.append(hexlayer)
    return hexlayer,

prevlayers = []
ani = animation.FuncAnimation(fig, animate, frames=12)
ani.save('teste.gif', writer='PillowWriter')

I'm trying to show only one frame at a time, but the code that I have written uses two ax.hexbin() calls and I have to remove one of them in order to show the correct graph. Is there a way to show one hexbin layer at a time using FuncAnimation?


Solution

  • You only need ax.clear() for each frame

    from matplotlib import animation
    import matplotlib.pyplot as plt
    import numpy as np
    
    fig, ax = plt.subplots()
    
    def animate(i):
        
        ax.clear()
        x0,y0 = np.random.random(size=(2,))*4-2
        x = np.random.normal(loc=x0, size=(1000,))
        y = np.random.normal(loc=y0, size=(1000,))
    
        hexlayer = ax.hexbin(x,y, gridsize=10, alpha=0.5)
        
        return ax 
    
    ani = animation.FuncAnimation(fig, animate, frames=12)
    ani.save('teste.gif', writer='PillowWriter')
    

    this code produces

    fig