- mer. 13 janvier 2016
- INPROS
- #ipython jupyter
Ipython notebook : cours INPROS ¶
Auteur: Marc BUFFAT, Pr dpt de Mécanique, UCB Lyon 1
Contributeurs: Violaine Louvet, Michel Kern, Loic Gouarin, Laurence Viry </h5>
Mise à disposition selon les termes de la Licence Creative Commons
Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 2.0 France.
%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")
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.
code = \
'''<iframe name=Matplotlib src=http://matplotlib.org/gallery#lines_bars_and_markers frameborder=0 width=600 height=300></iframe>'''
HTML(code)
Utilisation¶
il faut importer la librairie matplolib et son module pylab ainsi que numpy:
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
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¶
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)
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)
Sauvegarde sur fichiers (pdf, eps, png)¶
- plt.savefig(nom_fichier)
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
%%bash
evince mafigure.pdf
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¶
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
%%bash
ls -al *mp4
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)