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.

In [1]:
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"

Réglage en vidéo

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 ]$.

In [2]:
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()
No description has been provided for this image

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.

In [3]:
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()
No description has been provided for this image

Utilisation de raccourcis

Au lieu de spécifier plusieurs arguments pour décrire le style d'une ligne, vous pouvez utiliser une notation raccourcie :

In [4]:
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()
No description has been provided for this image

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.

In [5]:
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)') 
Out[5]:
Text(0, 0.5, 'f(t)')
No description has been provided for this image
In [6]:
plt.figure(2)
plt.plot(xr, yr1*3., '-.b^', lw=1, label='a second curve')
plt.legend()
plt.xlabel('t')
plt.ylabel('f(t)')
Out[6]:
Text(0, 0.5, 'f(t)')
No description has been provided for this image
In [7]:
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 
No description has been provided for this image
In [8]:
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 
No description has been provided for this image
In [9]:
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()
No description has been provided for this image

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.