Skip to content

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.

py
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

py
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)
  • largeur et hauteur : 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 figure
  • fig.add_axes([0, 0, 0.5, 0.5]) : l'axe occupe la moitié de la largeur et de la hauteur
  • fig.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

py
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

py
fig, axes = plt.subplots(nrows=1, ncols=2)  # 1 ligne, 2 colonnes
  • fig : 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
py
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
py
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()