Introduction à la librairie matplotlib
¶
Cette introduction reprend des exemples d'un cours de physique numérique de l'Ecole Polytechnique fait en anglais. Un grand merci à son auteur Michel Ferrero (CPHT, Ecole Polytechnique) pour son autorisation.
matplotlib
est une librairie python pour faire des tracés de courbes et des figures de très bonnes qualités dans une grande variété de formats.
Le site internet du projet est matplotlib.org. La documentation et surtout les exemples sur le site du projet ne sont malheureusement pas toujours très faciles à comprendre car ils se basent sur le matplotlib OO (orienté objet). Nous n'allons utiliser qu'une sous partie de matplotlib : matplotlib.pyplot
et nous utiliserons une syntaxe simplifiée qui est bien expliquée dans le tutoriel de matplotlib.pyplot. Cette syntaxe est largement suffisante pour nos besoins.
Pour commencer à utliser matplotlib.pyplot
il faut importer la bibliothèque avec la ligne suivante.
import matplotlib.pyplot as plt
Le réglage par défaut de spyder est d'afficher les fenêtres graphiques dans un onglet "Graphes". Il est parfois plus pratique d'afficher les figures dans des fenêtres indépendantes (fenêtres graphiques interactives), il convient au préalable de faire le réglage suivant : Outils-> Préférences -> Console IPython -> Graphiques et régler "Sortie graphique" sur "automatique"
Ensuite, on redémarre Spyder pour que ces modifications soient prises en compte.
Note : Ceux qui utilisent jupyter notebook (ce qui n'est pas recommandé pour ce cours) il faut rajouter la ligne magique : %matplolib auto
Un premier exemple¶
La syntaxe de matplotlib.pyplot est en général très intuitive.
Le code ci-dessous est le premier exemple de tracé de la fonction cosinus dans l'intervalle $[ 0, 2\pi ]$.
import numpy as np
x_points = np.linspace(0, 2*np.pi, 30)
y_points = np.cos(x_points)
plt.plot(x_points, y_points)
plt.show()
On peut fermer une figure avec la commande plt.close()
. La commande plt.close(1)
ferme la figure 1, plt.close('all')
ferme toutes les figures.
Rendre les graphes plus beaux¶
Si vous souhaitez tracer plusieurs courbes, il suffit d'appeler la fonction plot
plusieurs
fois. Ensuite, vous pouvez travailler sur la couleur et le style des lignes en ajoutant des arguments
à la fonction plot
comme ci-dessous. Vous pouvez également voir comment sont ajoutés des axes, des légendes, etc. Les commandes sont explicites si on comprend l'anglais.
import numpy as np
x_points = np.linspace(0, 2*np.pi, 30)
y1_points = np.cos(x_points)
y2_points = np.sin(x_points)
# The plot with line styling
plt.plot(x_points, y1_points, color='blue', linestyle='-', linewidth=3, marker='o', label="cos")
plt.plot(x_points, y2_points, color='red', linestyle='--', linewidth=2, marker='x', label="sin")
# Add title, labels, etc.
plt.title("Two functions", fontsize=22)
plt.xlabel(r"$\theta$", fontsize=18) # On utilise Latex pour les lettres grecques
# Notez à la fois le r et les $$.
plt.ylabel("Cosinus, Sinus", fontsize=18)
plt.legend(fontsize=18)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
#plt.tick_params(axis='both',labelsize=20) # Variante pour changer la taille des fontes à 20 sur les deux axes en une seule commande.
plt.xlim(0, 2*np.pi)
plt.ylim(-1.2, 1.2)
plt.show()
Utilisation de raccourcis¶
Au lieu de spécifier plusieurs arguments pour décrire le style d'une ligne, vous pouvez utiliser une notation raccourcie :
x_points = np.linspace(0, 2*np.pi, 30)
y_points = np.cos(x_points)
# look at the shortcut style
plt.plot(x_points, y_points, 'o-r', lw=2) # o-r veut dire utilise des cercles, un trait plein et la couleur rouge
# une épaisseur de ligne égale à 2.
plt.show()
D'autres exemples plus sophistiqués.¶
En principe, les exemples ci-dessus sont suffisants pour la plupart des besoins. Ci-dessous quelques exemples supplémentaires sont présentés. Vous pouvez notamment voir comment fonctionne la commande 'subplot' ou encore comment tracer en échelle semilog.
xr = np.arange(0, 3, 0.1)
yr1 = np.exp(xr) * (np.sin(5 * xr))
yr2 = np.exp(xr) * (np.cos(5 * xr))
plt.figure(1)
plt.plot(xr, yr1, '-r', lw=3, label='a first curve')
plt.plot(xr, yr2, '--b', lw=3, label='$e^{x} \cos(5 x)$') # Cette expression utilise Latex entre $ $ pour le label
plt.legend()
plt.xlabel('temps')
plt.ylabel('f(t)')
plt.figure(2)
plt.plot(xr, yr1*3., '-.b^', lw=1, label='a second curve')
plt.legend()
plt.xlabel('t')
plt.ylabel('f(t)')
plt.figure(3)
plt.subplot(2,1,1)
plt.plot(xr, yr1,'-r', lw=3, label='a first curve')
plt.legend()
plt.ylabel('f(t)')
plt.xlabel('t')
plt.subplot(2,1,2)
plt.plot(xr, yr2, '--b', lw=3, label='$e^{x} \cos(5 x)$')
plt.legend()
plt.xlabel('t')
plt.ylabel('f(t) ')
plt.tight_layout() # Permet d'écarter les sous figures
plt.figure(4)
plt.subplot(1,2,1)
plt.title('My title')
plt.plot(xr, yr1, '-r', lw=3, label='a first curve')
plt.legend()
plt.ylabel('$\int \, \cos(t) $')
plt.xlabel('time $t$')
plt.subplot(1,2,2)
plt.grid(True)
plt.plot(xr, yr2, '--b', lw=3, label='$e^{x} \cos(5 x)$')
plt.legend()
plt.xlabel('time $t$')
plt.tight_layout() # Permet d'écarter les sous figures
plt.figure(5)
yr3 = np.exp(2*xr)
plt.title('Tracé en semilog suivant y')
plt.semilogy(xr, yr3, '-k')
plt.xlabel('x', fontsize=18)
plt.ylabel('$e^{2x}$', fontsize=18)
plt.grid()
Plus informations¶
matplotlib
peut faire beaucoup de choses. La meilleure stratégie consiste généralement à examiner des exemples (comme ceux du site web de matplotlib
) et voir le code qui les a produites. Vous pouvez alors
les adapter à vos besoins. Hélas, la syntaxe est parfois un peu ardue car comme mentionné en introduction, l'utilisation de matplotlib orienté object peut s'avérer déroutante si on ne maitrise pas la programmation objet. Il faut copier avec prudence les exemples que l'on trouve sur les forums ou même sur la documentation officielle. Il est plutôt conseillé d'aller sur le tutoriel de matplotlib.pyplot.
- Tutoriel de l'interface pyplot sur le site matplotlib.pyplot.
- Une vidéo illustrative qui explique bien les difficultés de matplotlib OO.