Matplotlib (souvent abrégé en MPL) est une bibliothèque Python de visualisation de données. Elle permet de créer une grande variété de graphiques, tels que des graphiques en barres, des graphiques à points, des graphiques en nuage de points, des graphiques en boîte, des graphiques en aires, des graphiques en secteurs, des graphiques de densité, des graphiques de contour, des cartes, etc.
Matplotlib est très flexible et personnalisable, et permet aux utilisateurs de créer des graphiques précis et beaux en utilisant une syntaxe simple. Matplotlib est souvent utilisé en conjonction avec les bibliothèques NumPy et Pandas pour visualiser des données.
Je vous conseille l'utilisation d'un environnement virtuel (venv) pour gérer votre projet, bien que cela ne soit pas une obligation. Pour plus d'informations sur l'utilisation de venv : https://docs.python.org/fr/3/library/venv.html
Vous pouvez installer le logiciel MatPlotLib et passant par l'outil pip
(Python Install Package).
!pip install matplotlib
import matplotlib.pyplot as plt
plt.title("Une courbe censée afficher des vitesses")
data = [10, 20, 50, 80, 70, 80, 90, 50, 40, 10]
plt.plot(data, "b") # On trace la courbe en bleu ("b")
plt.xlabel("time")
plt.ylabel("speed")
Text(0, 0.5, 'speed')
Un Jupyter Notebook affiche automatiquement le graphe produit, comme vous pouvez le constater ci-dessus. Si vous travaillez avec PyCharm, ou équivalent, il est nécessaire de lancer l'afficher la fenêtre.
plt.show()
Mais l'appel de la fonction plt.show()
dans un Jupyter permet néanmoins de ne pas avoir l'affichage de la dernière donnée calculée (Text(0, 0.5, 'speed')
, dans l'exemple ci-dessus). Je vais donc l'utiliser dans les exemples de code qui suivent.
Il est possible de changer les dimensions du graphique (paramètre nommé figsize). Les dimensions doivent être exprimées en pouces.
Il est aussi possible de changer le style de la courbe (la chaîne de caractère qui suit le jeu de données en ordonnées).
plt.figure(figsize=(10, 4))
plt.title("Une courbe censée afficher des vitesses")
data = [10, 20, 50, 80, 70, 80, 90, 50, 40, 10]
plt.plot(data, "r--o") # On trace la courbe en rouge (r),en pointillés (--) et on utilise un marqueur rond.
plt.xlabel("time")
plt.ylabel("speed")
# Affichage de la figure (surtout utile, si MPL est utilisé de manière standalone).
plt.show()
Voici quelques marqueurs supportés :
Il est aussi possible d'afficher une grille pour mieux voir la position de vos points.
plt.figure(figsize=(10, 4))
plt.title("Une courbe censée afficher des vitesses")
# On dessine notre courbe.
data = [10, 20, 50, 80, 70, 80, 90, 50, 40, 10]
plt.plot(data, "r--o")
plt.xlabel("time")
plt.ylabel("speed")
plt.grid(True, which="both")
# Affichage de la figure.
plt.show()
La méthode plot
peut être invoquée de différentes manières :
plt.figure(figsize=(10, 4))
plt.title("Deux courbes censées afficher des vitesses")
data1 = [10, 20, 50, 80, 70, 80, 90, 50, 40, 10]
data2 = [50, 80, 70, 80, 90, 50, 40, 10, 10, 20]
plt.plot(data1, "b-", data2, "r--o")
plt.xlabel("time")
plt.ylabel("speed")
plt.grid(True, which="both")
# Affichage de la figure.
plt.show()
Il est aussi possible de produire le même graphique en invoquant deux fois de suite la fonction plot
.
Personnellement, je préfère cette approche.
plt.figure(figsize=(10, 4))
plt.title("Deux courbes censées afficher des vitesses")
# Nos données à tracer.
data1 = [10, 20, 50, 80, 70, 80, 90, 50, 40, 10]
data2 = [50, 80, 70, 80, 90, 50, 40, 10, 10, 20]
# On trace deux courbes.
plt.plot(data1, "b-")
plt.plot(data2, "r--o")
plt.xlabel("time")
plt.ylabel("speed")
plt.grid(True, which="both")
# Affichage de la figure.
plt.show()
Vous pouvez ajouter une légende au graphique de deux manières différentes : tout dépend de comment vous souhaitez "ploter" vos courbes. Ce premier exemple utilise un seul appel à la fonction plot
.
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
plt.title("Deux courbes courbes trigonométriques")
# On produit les données pour nos deux courbes trigonométriques.
x = np.linspace(-np.pi, np.pi, 1000) # On veut 1000 points compris entre -PI et PI
y1 = np.sin(x)
y2 = np.cos(x)
# On trace les deux courbes.
plt.plot(x, y1, "b", x, y2, "r--")
plt.legend(["Courbe sinus", "Courbe cosinus"])
plt.xlabel("x \u2208 [-\u03c0, \u03c0]") # \u03c0 correspond au code Unicode du caractère π
plt.ylabel("y")
plt.grid(True, which="both")
# Affichage de la figure.
plt.show()
Si vous optez pour deux appels distincts à la fonction plot
, vous pouvez aussi passer les labels de la légende directement lors de la demande tracé d'une courbe.
Dans ce cas, il ne faut pas oublier de quand même appeler la fonction legend
, même si elle ne prend plus de paramètre. Dans le cas contraire, la légende ne s'affichera pas !
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
plt.title("Deux courbes courbes trigonométriques")
# On produit les données pour nos deux courbes trigonométriques.
x = np.linspace(-np.pi, np.pi, 1000) # On veut 1000 points compris entre -PI et PI
y1 = np.sin(x)
y2 = np.cos(x)
# On trace les deux courbes.
plt.plot(x, y1, "b", label="Courbe sinus")
plt.plot(x, y2, "r--", label="Courbe cosinus")
plt.legend() # Ne pas l'oublier !!!
plt.xlabel("x \u2208 [-\u03c0, \u03c0]")
plt.ylabel("y")
plt.grid(True, which="both")
# Affichage de la figure.
plt.show()
Notez aussi que vous pouvez contrôler la position (paramètre loc
) de la légende sur le graphique. Voici quelques valeurs autorisées :
Par défaut, c'est la valeur best
qui est considérée.
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
plt.title("Deux courbes courbes trigonométriques")
# On produit les données pour nos deux courbes trigonométriques.
x = np.linspace(-np.pi, np.pi, 1000) # On veut 1000 points compris entre -PI et PI
y1 = np.sin(x)
y2 = np.cos(x)
# On trace les deux courbes.
plt.plot(x, y1, "b", label="Courbe sinus")
plt.plot(x, y2, "r--", label="Courbe cosinus")
plt.legend(loc="lower center")
plt.xlabel("x \u2208 [-\u03c0, \u03c0]")
plt.ylabel("y")
plt.grid(True, which="both")
# Affichage de la figure.
plt.show()
Il est aussi possible de sauvegarder votre graphique sous forme d'une image. Pour ce faire, il vous faudra utiliser la fonction savefig
. Plusieurs formats de fichiers sont supportés, dont : GIF, JPG, PNG, TIFF, ...
Voici un exemple de sauvegarde du graphique en cours.
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
plt.title("Deux courbes courbes trigonométriques")
# On produit les données pour nos deux courbes trigonométriques.
x = np.linspace(-np.pi, np.pi, 1000) # On veut 1000 points compris entre -PI et PI
y1 = np.sin(x)
y2 = np.cos(x)
# On trace les deux courbes.
plt.plot(x, y1, "b", label="Courbe sinus")
plt.plot(x, y2, "r--", label="Courbe cosinus")
plt.legend()
plt.xlabel("x \u2208 [-\u03c0, \u03c0]")
plt.ylabel("y")
plt.grid(True, which="both")
plt.savefig("TrigoCurves.png") # Ici, l'image est enregistrée au format PNG.
Voici un exemple de tracé d'une spirale, en utilisant la paramétrisation polaire de la spirale. La paramétrisation polaire d'une spirale est une manière de décrire les points dans le plan en utilisant des coordonnées radiales et angulaires.
import numpy as np
import matplotlib.pyplot as plt
# La paramétrisation polaire de la spirale.
theta = np.linspace(0, 10 * np.pi, 1000) # Angles de 0 à 10 π
r = theta # Rayon égal à l'angle pour une spirale
# Conversion en coordonnées cartésiennes (à base de fonctions trigonométriques).
x = r * np.cos(theta)
y = r * np.sin(theta)
# On déssine la spirale.
plt.plot(x, y)
plt.axis('equal') # Permet de s'assurer que les échelles des axes x et y sont égales.
plt.show()