Marc BUFFAT

Professeur au département de Mécanique, Lyon 1 e-mail

Blog scientifique et pédagogique utilisant des notebooks IPython et Linux

cours en ligne INPROS: chapitre 7


Ipython notebook : cours INPROS LyonHPC

Auteur: Marc BUFFAT, Pr dpt de Mécanique, UCB Lyon 1

Contributeurs: Violaine Louvet, Michel Kern, Loic Gouarin, Laurence Viry </h5>

Licence Creative Commons
Mise à disposition selon les termes de la Licence Creative Commons
Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 2.0 France
.
In [1]:
%matplotlib inline
%autosave 300
from IPython.display import HTML,display
css_file = 'style.css'
try:
    display(HTML(open(css_file, "r").read()))
    print("using ",css_file)
except :
    print("using default css")
Autosaving every 300 seconds
using  style.css

INPROS LyonHPC
plot3d

Introduction à matplotlib

Matplotlib est une bibliothèque de Python destinée à tracer et visualiser des données sous formes de graphiques. Combinée avec numpy, elle permet une analyse des simulations numériques, à la fois sous forme interactive et pour produire des documents de très grande qualité, directement utilisable dans les publications scientifiques.

In [2]:
code = \
'''<iframe name=Matplotlib src=http://matplotlib.org/gallery#lines_bars_and_markers frameborder=0  width=600 height=300></iframe>'''
HTML(code)
Out[2]:

Utilisation

il faut importer la librairie matplolib et son module pylab ainsi que numpy:

In [3]:
import numpy as np
import matplotlib.pyplot as plt

Exemple: tracer simple d’une courbe

fonction plot pour tracer la fonction y=f(x) donnée par ses valeurs Y en des points discrets X

In [4]:
import numpy as np
import matplotlib.pyplot as plt
X=np.linspace(-6*np.pi,6*np.pi,400)
Y=np.sin(X)/X
plt.plot(X,Y)
plt.show()

remarques

  • l’utilisation de la fonction plt.show() n’est pas obligatoire en mode interactif avec ipython (mais nécessaire avec python)
  • l’importation de la librairie pyplot sous le nom plt est une convention souvant utilisée

      import matplotlib.pyplot as plt
  • de même, on peut importer numpy implicitement au lieu d’utiliser le nom np (courant)

      from numpy import *

question

Que fait le programme précédent avec X=np.linspace(-6*np.pi,6*np.pi,401)

Tracé de courbes

Fonctions de tracé de courbes avec sous-figures, légende et titre

  • plt.subplot(nline,ncol,num)
  • plt.xlabel(titre axe des X) plt.ylabel(titre axe des Y)
  • plt.legend(loc=position,fontsize=size)
  • plt.title(titre,fontsize=size)

Exemple: tracer avec sous-figures

In [5]:
plt.figure(figsize=(8,4))
plt.subplot(1,2,1)
plt.plot(X,np.sin(X)/X,'-r',lw=2,label="sin(x)/x")
plt.plot(X,np.sin(2*X)/X,'--g',lw=1,label="$\\frac{\sin 2x}{x}$")
plt.xlabel('x'); plt.ylabel('y(x)')
plt.title('sous figure 1',fontsize=16)
plt.legend(loc=0)
plt.subplot(1,2,2)
plt.plot(X,(1-np.cos(X))/X,'-b',lw=2,label="$\\frac{1-\cos x}{x}$")
plt.plot(X,(1-np.cos(2*X))/X,'--c',lw=1,label="$\\frac{1-\cos 2x}{x}$")
plt.legend(loc=0)
plt.xlabel('t'); plt.ylabel('z(t)')
plt.title('sous figure 2',fontsize=24)
plt.show()

Sélection des limites des axes

  • plt.xlim(xmin,xmax)

  • plt.ylim(ymin,ymax)

In [6]:
plt.xlim(-10,10)
plt.ylim(-1.,1)
plt.plot(X,np.sin(X)/X,'-r',lw=2,label="$\\frac{\sin x}{x}$")
plt.plot(X,np.sin(2*X)/X,'--g',lw=1,label="$\\frac{\sin 2x}{x}$")
plt.legend(loc=0,fontsize=20)
Out[6]:
<matplotlib.legend.Legend at 0x7faa1e2e8588>
In [7]:
plt.plot(X,np.sin(X)/X,'-r',lw=2,label="$\\omega=1$")
plt.plot(X,np.sin(2*X)/X,'--g',lw=1,label="$\\omega=2$")
plt.legend(loc=0,fontsize=20)
plt.title('fonction $\\frac{\sin{\omega x}}{x}$',fontsize=24)
plt.savefig('mafigure.pdf',bbox_inches='tight')
In [8]:
%%bash
ls -al mafigure.pdf
-rw-rw-r-- 1 buffat buffat 14354 janv. 27 22:23 mafigure.pdf
In [9]:
%%bash
evince mafigure.pdf

mplot3d bibliothèque (toolkit) de tracés 3D simples (*) sous matplotlib

(*) pour des tracés complexes: librairies spécialisées OpenGL (Mayavi avec VTK)

surface(X,Y,Z,rstride=1,cstride=1)

Exemple

In [10]:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z,rstride=1,cstride=1,cmap='jet')
ax.set_zlim(-1.5,1.5)
ax.view_init(elev=30, azim=30)
plt.show()

Animation

utilisation de la bibliothéque matplotlib.animation et de la fonction

  • FuncAnimation(figure,animate,init_func=init,frames=n,interval=pas,blit=True)

principe: on génère n images avec une fonction utilisateur animate(i) (i numéro de l’image), et on obtiens une vidéo avec un délai de pas millisecondes entre l’appel de la fonction. La fonction utilisateur init() permet une initialisation de la séquence.

Exemple d’animation

In [11]:
import numpy as np
from matplotlib import animation
# tracer d'une onde sin(x)/x*cos(omega*t)
L=4*np.pi
X=np.linspace(-L,L,100)
Y=np.sin(X)/X
omega=1.0
T=4*np.pi # periode d'étude
N=100
dt=T/(N-1)
# initialise la figure et les axes
fig = plt.figure()
ax  = plt.axes(xlim=(-L, L), ylim=(-1, 1))
ax.set_title("Evolution en temps d'une onde")
line, = ax.plot([], [], lw=2)
# initialise les données
def init():
    global line
    line.set_data([], [])
    return line,
# fonction animation : i numero d'image
def animate(i):
    global dt,omega,T,line
    t=i*dt
    line.set_data(X, Y*np.cos(omega*t))
    return line,
# animation
anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=100, interval=20, blit=True)
# sauvegarde la video dans le fichier mon_animation.mp4 à 30 images/sec
anim.save('mon_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])

Remarques

  • notez la virgule dans la ligne return des fonctions animate et init: elle est obligatoire car on retourne une liste

  • la fonction save utilise un programme externe pour générer la vidéo: ffmepg qui doit donc être installé pour pouvoir l’utiliser

  • en interactif on peut utiliser plt.show() pour afficher l’animation sous python

In [12]:
%%bash
ls -al *mp4
-rw-rw-r-- 1 buffat buffat 48228 janv. 27 22:24 mon_animation.mp4
In [13]:
from IPython.display import HTML
code = """
<video width="400" height="280" controls>
<source src="mon_animation.mp4" type="video/mp4">
Your browser does not support the video tag
</video>"""
HTML(code)
Out[13]:
INPROS LyonHPC

plot3d