Nous proposons dans ce chapitre quelques méthodes pour créer mais surtout, sauvegarder dans un format standard, les animations créées sous python.
Pour créer un GIF animé, il faut installer ImageMagick (disponible sur note site ici ou directement sur le site officiel).
Warning
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.
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
Pour quelques extras-arguments, on pourra se reporter à la documentation de Matplotlib p.253 (263 sur 1045).
Warning
La commande rm doit être utilisée sous linux à la place de del sous windows
Pour garder la trace, il suffit d’enlever la commande clf() qui permet d’effacer chaque image.
Warning
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.
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.
Le code peut être téléchargé ici : Collision de galaxies.
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