Tracé avec matplotlib
Contenu
8. Tracé avec matplotlib¶
%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¶
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()
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()
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);
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')
%%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()
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'])
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())