Création de sous-graphiques Matplotlib

MatplotlibBeginner
Pratiquer maintenant

Introduction

En visualisation de données, il est souvent utile d'afficher plusieurs graphiques dans une seule figure. Cela permet une comparaison facile entre différents ensembles de données ou différentes vues des mêmes données. Matplotlib offre un moyen puissant et pratique de créer de telles figures en utilisant des sous-graphiques (subplots).

La manière la plus courante de créer des sous-graphiques est d'utiliser la fonction plt.subplots(). Cette fonction crée une figure et une grille de sous-graphiques en un seul appel, retournant un objet Figure et un tableau d'objets Axes, qui représentent chaque sous-graphique individuel.

Dans ce laboratoire, vous apprendrez à :

  • Créer une figure contenant plusieurs sous-graphiques.
  • Tracer des données sur des sous-graphiques spécifiques.
  • Ajuster la disposition pour éviter que les graphiques ne se chevauchent.
  • Partager des axes entre les sous-graphiques pour des comparaisons plus claires.

Vous écrirez et exécuterez des scripts Python dans le WebIDE. Comme cet environnement ne prend pas en charge les fenêtres d'interface graphique interactives, vous enregistrerez vos graphiques sous forme de fichiers image et les visualiserez directement dans l'éditeur.

Ceci est un Guided Lab, qui fournit des instructions étape par étape pour vous aider à apprendre et à pratiquer. Suivez attentivement les instructions pour compléter chaque étape et acquérir une expérience pratique. Les données historiques montrent que c'est un laboratoire de niveau débutant avec un taux de réussite de 100%. Il a reçu un taux d'avis positifs de 100% de la part des apprenants.

Créer une figure et des axes avec plt.subplots()

Dans cette étape, vous commencerez par créer une figure contenant deux sous-graphiques vides disposés en une ligne et deux colonnes. C'est l'étape fondamentale pour construire des visualisations multi-graphiques.

Nous utiliserons la fonction plt.subplots(). Lorsque vous appelez plt.subplots(nrows, ncols), elle retourne deux éléments :

  1. Un objet Figure, qui est la fenêtre ou la page globale sur laquelle tout est dessiné. Nous l'assignons généralement à une variable nommée fig.
  2. Un tableau d'objets Axes. Chaque objet Axes représente l'un des sous-graphiques de la grille. Vous pouvez y accéder par leur index. Pour une grille de (1, 2), nous pouvons décompresser ce tableau en deux variables, ax1 et ax2.

Écrivons le code. Ouvrez le fichier main.py depuis l'explorateur de fichiers à gauche et ajoutez le contenu suivant. Ce script importera les bibliothèques nécessaires, créera une figure avec deux sous-graphiques et l'enregistrera sous le nom de fichier plot1.png.

import matplotlib.pyplot as plt
import numpy as np

## Create a figure and a set of subplots.
## 1 row, 2 columns.
fig, (ax1, ax2) = plt.subplots(1, 2)

## Save the figure to a file.
## The file will be created in the /home/labex/project directory.
plt.savefig('plot1.png')

print("Figure saved as plot1.png")

Exécutez maintenant le script depuis le terminal pour générer le graphique.

python3 main.py

Vous devriez voir la sortie suivante dans votre terminal :

Figure saved as plot1.png

Un nouveau fichier nommé plot1.png apparaîtra dans l'explorateur de fichiers. Double-cliquez dessus pour visualiser votre première figure avec deux sous-graphiques vides.

Plot1

Tracer sur le premier sous-graphique avec ax1.plot()

Dans cette étape, vous apprendrez à dessiner un graphique sur l'un des objets Axes spécifiques que vous avez créés. Chaque objet Axes possède ses propres méthodes de traçage, telles que plot(), bar(), scatter(), etc., qui sont similaires aux fonctions de l'interface principale plt.

Nous allons tracer une simple onde sinusoïdale sur le premier sous-graphique, représenté par la variable ax1. Nous ajouterons également un titre à ce sous-graphique en utilisant la méthode set_title().

Mettez à jour votre fichier main.py avec le code suivant. Nous ajoutons la génération de données à l'aide de NumPy, puis nous la traçons sur ax1.

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y)
ax1.set_title('Sine Wave')

## Save the figure to a new file
plt.savefig('plot2.png')

print("Figure saved as plot2.png")

Exécutez maintenant le script mis à jour dans le terminal.

python3 main.py

Vous verrez cette sortie :

Figure saved as plot2.png

Un nouveau fichier, plot2.png, se trouve maintenant dans votre répertoire de projet. Ouvrez-le pour voir le résultat. Le sous-graphique de gauche devrait maintenant contenir un graphique d'onde sinusoïdale, tandis que celui de droite reste vide.

Plot2

Tracer sur le second sous-graphique avec ax2.plot()

Dans cette étape, vous complèterez la figure en ajoutant un graphique au second sous-graphique. Le processus est identique à l'étape précédente, mais cette fois, vous appellerez la méthode plot() sur l'objet ax2.

Nous allons tracer une onde cosinusoïdale sur le second sous-graphique pour la comparer à l'onde sinusoïdale. Nous lui donnerons également un titre.

Modifiez votre fichier main.py pour inclure le traçage sur le second axe.

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y1 = np.sin(x ** 2)
y2 = np.cos(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y1)
ax1.set_title('Sine Wave')

## Plot on the second subplot (ax2)
ax2.plot(x, y2, 'tab:orange')
ax2.set_title('Cosine Wave')

## Save the figure to a new file
plt.savefig('plot3.png')

print("Figure saved as plot3.png")

Dans le code ci-dessus, nous avons ajouté 'tab:orange' à l'appel de ax2.plot() pour changer la couleur de la ligne, rendant les graphiques visuellement distincts.

Exécutez à nouveau le script dans le terminal.

python3 main.py

La sortie sera :

Figure saved as plot3.png

Maintenant, ouvrez plot3.png. Vous verrez une figure complète avec deux graphiques côte à côte. Cependant, vous pourriez remarquer que les titres ou les étiquettes des axes pourraient être un peu serrés. Nous corrigerons cela dans la prochaine étape.

Plot3

Ajuster la disposition des sous-graphiques avec plt.tight_layout()

Dans cette étape, vous apprendrez à ajuster automatiquement l'espacement entre les sous-graphiques pour éviter que les titres et les étiquettes ne se chevauchent. Matplotlib fournit une fonction simple pour cela : plt.tight_layout().

Cette fonction examine les boîtes englobantes de tous les éléments graphiques de la figure (comme les titres, les étiquettes et les graphiques eux-mêmes) et ajuste les paramètres des sous-graphiques pour que tout s'intègre proprement sans chevauchement. Il est conseillé de l'appeler juste avant de sauvegarder ou d'afficher votre graphique.

Ajoutons plt.tight_layout() à notre script. Mettez à jour main.py comme suit :

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y1 = np.sin(x ** 2)
y2 = np.cos(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y1)
ax1.set_title('Sine Wave')

## Plot on the second subplot (ax2)
ax2.plot(x, y2, 'tab:orange')
ax2.set_title('Cosine Wave')

## Adjust layout to prevent overlap
plt.tight_layout()

## Save the figure to a new file
plt.savefig('plot4.png')

print("Figure saved as plot4.png")

La seule modification est l'ajout de la ligne plt.tight_layout(). Exécutez maintenant le script.

python3 main.py

Sortie :

Figure saved as plot4.png

Ouvrez plot4.png et comparez-le avec plot3.png. Vous devriez remarquer que l'espacement entre les deux sous-graphiques a été optimisé, offrant une figure plus nette et plus professionnelle.

Plot4

Partager les axes avec sharex=True ou sharey=True

Dans cette étape, vous apprendrez à créer des sous-graphiques qui partagent un axe commun. Ceci est particulièrement utile lorsque vous comparez des ensembles de données qui ont la même échelle en x ou en y. Lorsque les axes sont partagés, le zoom ou le déplacement sur un sous-graphique mettra automatiquement à jour l'autre. Cela permet également de désencombrer la figure en supprimant les étiquettes de graduation redondantes.

Vous pouvez activer le partage d'axes en passant les arguments sharex=True ou sharey=True à plt.subplots().

Pour démontrer cela, créons un nouveau script. Créez un fichier nommé shared_axes.py dans votre répertoire de projet et ajoutez le code suivant. Cet exemple créera deux sous-graphiques empilés verticalement (nrows=2, ncols=1) qui partagent le même axe x.

import matplotlib.pyplot as plt
import numpy as np

## Create data
t = np.arange(0.01, 5.0, 0.01)
s1 = np.exp(t)
s2 = np.sin(2 * np.pi * t)

## Create a figure and two subplots that share the x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

## Plot on the first subplot
ax1.plot(t, s1, 'tab:blue')
ax1.set_ylabel('Exponential')

## Plot on the second subplot
ax2.plot(t, s2, 'tab:orange')
ax2.set_ylabel('Sinusoidal')
ax2.set_xlabel('time (s)')

## Adjust layout
plt.tight_layout()

## Save the figure
plt.savefig('plot5.png')

print("Figure saved as plot5.png")

Maintenant, exécutez ce nouveau script depuis le terminal.

python3 shared_axes.py

Sortie :

Figure saved as plot5.png

Ouvrez plot5.png. Remarquez que les étiquettes de graduation de l'axe x n'apparaissent que sur le sous-graphique du bas (ax2). C'est parce que sharex=True masque automatiquement les étiquettes de l'axe x intérieur pour créer un aspect plus propre. Les deux graphiques sont parfaitement alignés le long de l'axe x, ce qui les rend faciles à comparer.

Plot5

Résumé

Félicitations pour avoir terminé le laboratoire ! Vous avez appris les techniques essentielles pour créer et gérer des sous-graphiques dans Matplotlib.

Dans ce laboratoire, vous avez pratiqué :

  • L'utilisation de plt.subplots() pour créer une figure avec une grille de sous-graphiques.
  • L'accès aux objets Axes individuels et l'utilisation de leurs méthodes pour tracer des données.
  • L'ajout de titres à des sous-graphiques spécifiques.
  • L'utilisation de plt.tight_layout() pour ajuster automatiquement l'espacement et éviter le chevauchement des éléments.
  • La création de sous-graphiques avec des axes partagés en utilisant sharex=True pour une comparaison de données plus claire et une figure plus nette.

Ces compétences sont fondamentales pour créer des visualisations de données complexes et informatives. Vous pouvez maintenant construire des figures qui comparent efficacement plusieurs ensembles de données dans une vue unique et cohérente.