Animation avec matplotlib

Vous découvrirez ici comment créer une animation avec Python et matplotlib.

Animation avec effacement

Animation avec le module animation de matplotlib

Le module animation est disponible à partir de la version 1.1 de matplolib.

Nous allons utiliser la fonction FuncAnimation() du module animation.

Dans notre script, nous allons définir une fonction init() et une fonction animate(). La fonction init() servira à créer l’arrière de l’animation qui sera présent sur chaque image. La fonction animate() met à jour la courbe pour chaque image.

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

k = 2*np.pi
w = 2*np.pi
dt = 0.01

xmin = 0
xmax = 3
nbx = 100

x = np.linspace(xmin, xmax, nbx)

fig = plt.figure() # initialise la figure
line, = plt.plot([],[]) 
plt.xlim(xmin, xmax)
plt.ylim(-1,1)

# fonction à définir quand blit=True
# crée l'arrière de l'animation qui sera présent sur chaque image
def init():
    line.set_data([],[])
    return line,

def animate(i): 
    t = i * dt
    y = np.cos(k*x - w*t)
    line.set_data(x, y)
    return line,
 
ani = animation.FuncAnimation(fig, animate, init_func=init, frames=100, blit=True, interval=20, repeat=False)

plt.show()

La fonction FuncAnimation() dispose d’un argument avec une étiquette appelée interval, qui est le temps en millisecondes entre deux appels de la fonction de mise à jour, ici animate().

Animation sans le module animation

Nous présentons ici une technique d’animation plus basique qui n’utilise pas le module animation. Cette technique n’est pas recommandée mais elle peut servir pour des animations simples. Pour des animations plus élaborées, l’utilisation du module animation est préférable.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 3, 100)
k = 2*np.pi
w = 2*np.pi
dt = 0.01  

t = 0
for i in range(50):
    y = np.cos(k*x - w*t)
    if i == 0:
        line, = plt.plot(x, y)
    else:
        line.set_ydata(y)
    plt.pause(0.01) # pause avec duree en secondes
    t = t + dt
    
plt.show()

Animation sans effacement

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 3, 100)
k = 2*np.pi
w = 2*np.pi
dt = 0.01  

t = 0
for i in range(50):
    y = np.cos(k*x - w*t)
    plt.plot(x, y)
    plt.pause(0.01) # pause avec duree en secondes
    t = t + dt

plt.show()