L'objet Figure de Matplotlib
Matplotlib offre une approche orientée objet permettant de créer des visualisations complexes et personnalisables grâce à l'objet Figure
Qu'est-ce que l'objet Figure ?
L'objet Figure représente une toile blanche ou un canevas vierge, sur lequel des axes (Axes) peuvent être ajoutés.
Il permet de gérer des propriétés globales affectant tous les axes :
- La taille de la figure
- La résolution (DPI)
- Les paramètres de rendu globaux
INFO
Par défaut, une figure a une taille de 432x288 pixels, ne contient aucun axe et n'affiche rien à l'écran.
fig = plt.figure() # Création d'une figure vide
Ajouter un ensemble d'axes
Pour tracer des données, il est nécessaire d'ajouter un axe sur la figure.
INFO
ax = fig.add_axes([0, 0, 1, 1])
Les paramètres sont : [x0, y0, largeur, hauteur]
(x0, y0): coordonnées du coin inférieur gauche des axes, en proportion de la figure (0 à 1)largeurethauteur: largeur et hauteur de l'axe, également en proportion de la figure
Exemples
fig.add_axes([0, 0, 1, 1]): l'axe occupe toute la figurefig.add_axes([0, 0, 0.5, 0.5]): l'axe occupe la moitié de la largeur et de la hauteurfig.add_axes([0.5, 0.5, 0.5, 0.5]): l'axe commence au centre et occupe la moitié de la figure
Visualisation






Tracer sur un objet Axes
L’objet Axes constitue la zone de tracé où les données sont affichées. Il permet de :
- contrôler individuellement chaque axe
- créer plusieurs graphiques dans la même figure
- personnaliser chaque graphique séparément
Exemples
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
x = [0, 1, 2, 3, 4]
y = [0, 2, 4, 6, 8]
ax.plot(x, y) # Tracé sur cet axe
Créer plusieurs axes avec subplots
Pour gagner du temps et aligner plusieurs graphiques, on utilise plt.subplots() :
Exemple
fig, axes = plt.subplots(nrows=1, ncols=2) # 1 ligne, 2 colonnesfig: objet Figure (le canevas)axes: tableau d’objets Axes (numpy.ndarray)- Indexation :
axes[0]= premier graphique &axes[1]= deuxième graphique
ℹ️ Si nrows ou ncols > 1, axes devient un tableau 2D et l’indexation se fait ainsi : axes[i, j].
Fichier Python associé
POO basis
import matplotlib.pyplot as plt
import numpy as np
"""
Introduction à l'API orientée objet de Matplotlib
Cette méthode consiste à créer des objets Figure, puis à ajouter des objets Axes sur lesquels tracer des données.
Elle offre un contrôle plus fin et permet des visualisations complexes avec plusieurs tracés.
"""
# -----------------------------------------------------------
# Données
# -----------------------------------------------------------
a = np.linspace(0, 10, 11) # Tableau de 0 à 10, 11 points
b = a ** 4 # Puissance 4
x = np.arange(0, 10) # Tableau de 0 à 9
y = 2 * x # Relation linéaire
# -----------------------------------------------------------
# Création d'une Figure simple avec un axe
# -----------------------------------------------------------
fig = plt.figure() # Canevas vide
axes = fig.add_axes([0, 0, 1, 1]) # Ajouter un axe couvrant toute la figure
axes.plot(x, y) # Tracé linéaire simple
axes.set_xlabel('X')
axes.set_ylabel('Y')
axes.set_title('Tracé simple sur un axe')
plt.show()
# -----------------------------------------------------------
# Tracé avec des données plus complexes
# -----------------------------------------------------------
fig = plt.figure()
axes = fig.add_axes([0, 0, 1, 1])
axes.plot(a, b)
axes.set_xlabel('X')
axes.set_ylabel('Y')
axes.set_title('Tracé de a^4')
plt.show()
# -----------------------------------------------------------
# Ajout d'un deuxième axe sur la même figure
# -----------------------------------------------------------
fig = plt.figure()
axes1 = fig.add_axes([0, 0, 1, 1]) # Axe principal
axes2 = fig.add_axes([0.2, 0.2, 0.5, 0.5]) # Axe secondaire plus petit
axes1.plot(a, b)
axes1.set_xlabel('X')
axes1.set_ylabel('Y')
axes1.set_title('Grande figure')
axes2.plot(a, b)
axes2.set_title('Petite figure')
plt.show()
# -----------------------------------------------------------
# Déplacement et zoom sur le petit axe
# -----------------------------------------------------------
fig = plt.figure()
axes1 = fig.add_axes([0, 0, 1, 1]) # Axe principal
axes2 = fig.add_axes([0.2, 0.5, 0.25, 0.25]) # Axe secondaire repositionné
axes1.plot(a, b)
axes1.set_xlabel('X')
axes1.set_ylabel('Y')
axes1.set_title('Grande figure')
axes2.plot(a, b)
axes2.set_xlim(8, 10)
axes2.set_ylim(4000, 10000)
axes2.set_xlabel('X')
axes2.set_ylabel('Y')
axes2.set_title('Zoom avant')
plt.show()
# -----------------------------------------------------------
# Ajouter un axe en dehors de la figure principale
# -----------------------------------------------------------
fig = plt.figure()
axes1 = fig.add_axes([0, 0, 1, 1])
axes2 = fig.add_axes([0.2, 0.5, 0.25, 0.25])
axes3 = fig.add_axes([1, 1, 0.25, 0.25]) # Déborde du canevas
axes1.plot(a, b)
axes1.set_xlabel('X')
axes1.set_ylabel('Y')
axes1.set_title('Grande figure')
axes2.plot(a, b)
axes2.set_xlim(8, 10)
axes2.set_ylim(4000, 10000)
axes2.set_xlabel('X')
axes2.set_ylabel('Y')
axes2.set_title('Zoom avant')
axes3.plot(a, b)
axes3.set_title('Hors canevas')
plt.show()
# -----------------------------------------------------------
# Paramètres globaux de la figure
# -----------------------------------------------------------
fig = plt.figure(figsize=(12, 8), dpi=100)
axes = fig.add_axes([0, 0, 1, 1])
axes.plot(a, b)
axes.set_title('Figure personnalisée avec figsize et dpi')
plt.show()
# -----------------------------------------------------------
# Exporter une figure
# -----------------------------------------------------------
fig = plt.figure()
axes = fig.add_axes([0, 0, 1, 1])
axes.plot(a, b)
axes.set_xlabel('X')
axes.set_title('Exportation de figure')
fig.savefig('figure.png', bbox_inches='tight') # Sauvegarde propre avec marges ajustées
# -----------------------------------------------------------
# Exemple complet avec deux axes et exportation
# -----------------------------------------------------------
fig = plt.figure(figsize=(12, 8))
axes1 = fig.add_axes([0, 0, 1, 1])
axes2 = fig.add_axes([1, 1, 0.25, 0.25])
axes1.plot(x, y)
axes1.set_title('Grand axe')
axes2.plot(x, y)
axes2.set_title('Petit axe hors canevas')
fig.savefig('test.png', bbox_inches='tight')POO subplots
import matplotlib.pyplot as plt
import numpy as np
# ===========================================================
# Données
# ===========================================================
# Données non linéaires
a = np.linspace(0, 10, 11)
b = a ** 4
# Données linéaires
x = np.arange(0, 10)
y = 2 * x
# ===========================================================
# Figure simple avec un seul axe
# ===========================================================
# plt.subplots() retourne directement la Figure et l'objet Axes
fig, ax = plt.subplots()
ax.plot(x, y, color='red')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Relation linéaire')
plt.show()
# ===========================================================
# Création de plusieurs axes (subplots)
# ===========================================================
# 1 ligne, 2 colonnes
fig, axes = plt.subplots(nrows=1, ncols=2)
# axes est un tableau NumPy d'objets Axes
axes[0].plot(a, b)
axes[0].set_title('a⁴')
axes[1].plot(x, y)
axes[1].set_title('2x')
plt.show()
# ===========================================================
# Subplots en grille 2x2
# ===========================================================
fig, axes = plt.subplots(nrows=2, ncols=2)
axes[0, 0].plot(a, b)
axes[0, 0].set_title('a⁴')
axes[0, 1].plot(y, x)
axes[0, 1].set_title('y vs x')
axes[1, 0].plot(b, a)
axes[1, 0].set_title('b vs a')
axes[1, 1].plot(x, y)
axes[1, 1].set_title('2x')
plt.tight_layout()
plt.show()
# ===========================================================
# Paramètres globaux de Figure
# ===========================================================
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 8))
axes[0, 0].plot(a, b)
axes[0, 0].set_title('0,0')
axes[0, 1].plot(y, x)
axes[0, 1].set_title('0,1')
axes[1, 0].plot(b, a)
axes[1, 0].set_title('1,0')
axes[1, 1].plot(x, y)
axes[1, 1].set_title('1,1')
axes[1, 1].set_xlabel('X')
axes[1, 1].set_ylabel('Y')
# Paramètre global de la Figure
fig.suptitle('Niveau Figure', fontsize=16)
plt.tight_layout()
plt.show()
# ===========================================================
# Espacement manuel des subplots
# ===========================================================
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 8))
axes[0, 0].plot(a, b)
axes[0, 1].plot(y, x)
axes[1, 0].plot(b, a)
axes[1, 1].plot(x, y)
fig.subplots_adjust(
left=0.05,
right=0.95,
bottom=0.05,
top=0.9,
wspace=0.6,
hspace=0.3
)
plt.show()
# ===========================================================
# Exportation de la Figure
# ===========================================================
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 8))
axes[0, 0].plot(a, b)
axes[0, 1].plot(y, x)
axes[1, 0].plot(b, a)
axes[1, 1].plot(x, y)
fig.savefig('subplots.png', bbox_inches='tight')
plt.show()