Les animations

Nous proposons dans ce chapitre quelques méthodes pour créer mais surtout, sauvegarder dans un format standard, les animations créées sous python.

Créer un GIF animé

Pour créer un GIF animé, il faut installer ImageMagick (disponible sur note site ici ou directement sur le site officiel).

Avertissement

Vous devez rebooter la machine si vous opérez sous Windows. Dans le cas contraire, le fichier convert.exe d’ImageMagick rentre en conflit avec celui de Windowssystem32 qui permet de convertir une partition FAT en NTFS.

Sans garder la trace

Pour réaliser un GIF animé, il suffit de créer une succession d’images qui sont remplacées au fur et à mesure de la lecture. Dans l’exemple suivant, les pdf générés sont incrémentés puis effacer à l’aide de la commande del (rem pour Linux)

Voici une utilisation sur un exemple

# -*- coding: utf-8 -*-

"""
Animation d'une particule se baladant sur une ellipse
"""

from __future__ import division
from scipy import *                 
from pylab import *
import os

#initialisation
tini = 0
tfin = 2
Npas = 100

#Positions Successives
def Positions(t):
    x = 0.5*cos(2*pi*t)
    y = 0.5*sin(2*pi*t)
    return [x, y]

# Construction d'une série d'images et de leur assemblage dans une animation
for k in range(Npas):
    t = tini + (tfin-tini)*k/(Npas-1)
    plot(Positions(t)[0], Positions(t)[1], 'o', color='b')
    axis([-1, 1, -1, 1])
    filename = 'fichierTemp'+str('%02d' %k)+'.pdf'
    savefig(filename)
    print 'Nplot = ',  k
    clf()

# convert est une fonction d'ImageMagick : option -delay en 1/100 de seconde
cmd = 'convert fichierTemp*.pdf Modele_animation_001a.gif'
os.system(cmd)
os.system('del *.pdf')    # destruction des fichiers temporaires (utiliser rem sous Linux)
print "C'est fini !"

ce qui donne

_images/Modele_animation_001a.gif

Pour quelques extras-arguments, on pourra se reporter à la documentation de Matplotlib p.253  (263 sur 1045).

Avertissement

La commande rm doit être utilisée sous linux à la place de del sous windows

En gardant la trace

Pour garder la trace, il suffit d’enlever la commande clf() qui permet d’effacer chaque image.

_images/Modele_animation_001b.gif

Quelques exemples en physique

Avertissement

La commande rm doit être utilisée sous linux à la place de del sous windows

Particule évoluant dans un champ de pesanteur : Les équations différentielles sont résolues à l’aide de la méthode détaillée dans la chapitre dédié et les résultats sont tracés dans les graphiques successifs.

_images/Modele_animation_002.gif

Le code peut être téléchargé ici : Champ pesanteur.

Particules dans un champ newtonien (collision de galaxies) : Quelques boucles for plus tard et après 5 minutes de compilation, on est capable de résoudre une collision de galaxie dans l’approximation du champ moyen.

_images/Modele_animation_003.gif

Le code peut être téléchargé ici : Collision de galaxies.

Créer un film (mp4)

A partir de la version 1.2.0, Matplotlib intègre directement une fonction animation pour créer un film à partir d’images, comme le montre le code suivant :

# -*- coding: utf-8 -*-

"""
Représentation temporelle d'une onde
"""

from __future__ import division
from scipy import *
from pylab import *

from matplotlib import animation

x = linspace(0,10,500)

# Animation

def y(x,t):
	return cos(2*pi*t-pi*x)				# Fonction à animer


fig1 = figure()
ax = fig1.add_subplot(111)

xlim(0, 10)                                   			# Limites de l'axe des abscisses
xlabel(ur"$x \, (m)$", fontsize=16)        	# Label de l'axe des abscisses

ylim(-1.5, 1.5)                                			# Limites de l'axe des ordonnées
ylabel(ur"$y \, (m)$", fontsize=16)        	# Label de l'axe des ordonnées

line, = plot([], [], '-', color='b', lw=2)          	# Mise en forme extérieure à la boucle pour effacement entre chaque image

def init():          						# Initialisation avec du vide
    line.set_data([], [])
    return line,

def animate(i):
	t=i/25
	line.set_data(x, y(x,t))
	print("frame num %d" %i)
	return line,						# Ne pas oublier la "," pour le tupple


anim = animation.FuncAnimation(fig1, animate, frames=26, interval=2, init_func=init)

anim.save('representation_temporelle_1D.mp4', fps=25)	# Sauvegarde du film

show()

Le code peut être directement téléchargé ici : Représentation temporelle.

Alors que le film généré peut être téléchargé ici : Film Onde 1D.

Un bon exemple de l’utilisation de cette animation est celle des double pendule : http://matplotlib.org/examples/animation/double_pendulum_animated.html?highlight=animation