LyonHPC LyonHPC

8. Tracé avec matplotlib

plot3d
%matplotlib inline
import numpy as np
from IPython.display import HTML,display,IFrame,Video
from IPython.display import YouTubeVideo,Markdown
display(Markdown("**Video du cours: Introduction**"))
YouTubeVideo('UJI79P8voAI')

Video du cours: Introduction

Astuce

Pour tester les programmes Python, vous pouvez vous connectez sur un serveur Jupyter, par exemple, pour les étudiants Lyon1 https://jupyter.mecanique.univ-lyon1.fr

8.1. 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.

8.1.1. Site web [http://matplotlib.org]

display(IFrame("https://matplotlib.org/stable/gallery/index.html",width=800,height=300))

8.1.2. Tutorial en anglais

[http://scipy-lectures.org/intro/matplotlib/]

8.1.3. Utilisation

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

import numpy as np
import matplotlib.pyplot as plt

8.1.4. 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

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()
../_images/COURS_PLOT_11_0.png

8.1.4.1. 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 *
    

8.1.4.2. question

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

8.2. Tracé de courbes

display(Markdown("**Video du cours: tracé de courbes**"))
YouTubeVideo('OoHCpbQMM2Y')

Video du cours: tracé de courbes

Attention

Les vidéos utilisent un ancien interpréteur python 2.7, pour lequel print est un mot clé, soit print 'bonjour'. Avec Python 3, print est une fonction et il faut donc utiliser des parenthèses, soit print('bonjour')

8.2.1. 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)

8.2.2. Exemple: tracer avec sous-figures

# augmente la taille du texte par defaut
plt.rc('font', family='serif', size='16')
plt.figure(figsize=(16,8))
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=18)
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()
../_images/COURS_PLOT_18_0.png

8.2.3. Sélection des limites des axes

  • plt.xlim(xmin,xmax)

  • plt.ylim(ymin,ymax)

plt.figure(figsize=(12,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);
../_images/COURS_PLOT_20_0.png

8.2.4. Sauvegarde sur fichiers (pdf, eps, png)

  • plt.savefig(nom_fichier)

plt.figure(figsize=(12,8))
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')
../_images/COURS_PLOT_22_0.png
%%bash
ls -al mafigure.pdf
-rw-rw-r-- 1 buffat buffat 18433 avril  8 11:38 mafigure.pdf

8.3. Tracé de surface en 3D

display(Markdown("**Video du cours: tracé en 3D et animation**"))
YouTubeVideo('x-NVB2tWNtM')

Video du cours: tracé en 3D et animation

Attention

Les vidéos utilisent un ancien interpréteur python 2.7, pour lequel print est un mot clé, soit print 'bonjour'. Avec Python 3, print est une fonction et il faut donc utiliser des parenthèses, soit print('bonjour')

  • 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)

8.3.1. Exemple

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(10,6))
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()
../_images/COURS_PLOT_28_0.png

8.4. 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.

8.4.1. Exemple d’animation

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(figsize=(10,6))
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,repeat=False)
# sauvegarde la video dans le fichier mon_animation.mp4 à 30 images/sec
anim.save('mon_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])
../_images/COURS_PLOT_30_0.png

8.4.2. 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

%%bash
ls -al *mp4
-rw-rw-r-- 1 buffat buffat 73664 avril  8 11:38 mon_animation.mp4

8.4.3. Visualisation de l’animation

from IPython.display import HTML
HTML(anim.to_html5_video())

8.5. FIN de la leçon

plot3d