Skip to content

Personnalisation des graphiques

Matplotlib offre un système de stylisation très riche et très flexible permettant de contrôler l’apparence : légendes, couleurs, styles de lignes, marqueurs, épaisseur des traits, etc.

Legendes

Lorsque plusieurs courbes sont tracées sur un même graphique, il devient indispensable d’indiquer clairement ce que représente chaque ligne. C’est le rôle de la légende.

INFO

L’ajout d’une légende se fait en deux étapes :

  1. Associer un label à chaque tracé
  2. Appeler la méthode legend() sur l’objet Axes

Exemple

python
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 10)

fig, ax = plt.subplots()

ax.plot(x, x, label="x vs x")
ax.plot(x, x**2, label="x vs x²")

ax.legend()
plt.show()

Chaque couleur est maintenant associée à un intitulé clair.

Position de la légende

Par défaut, Matplotlib choisit automatiquement la meilleure position (loc='best'). Il est cependant possible de la forcer.

Positions prédéfinies:

python
ax.legend(loc='upper left')
ax.legend(loc='lower right')
ax.legend(loc='upper right')
CodePosition
0best
1upper right
2upper left
3lower left
4lower right

Couleurs et Styles

Une fois la légende en place, nous pouvons améliorer l’aspect visuel du graphique en personnalisant les couleurs, les styles de lignes et les marqueurs.

Couleurs des lignes

  1. Couleurs nommées
python
ax.plot(x, x, color='blue')
ax.plot(x, x+1, color='purple')

Quelques couleurs courantes : blue, red, green, orange, purple, black

  1. Couleurs personnalisées (codes hexadécimaux)
python
ax.plot(x, x, color='#2ecc71')  # vert
ax.plot(x, x+1, color='#f1c40f')  # jaune

Épaisseur des lignes

L’épaisseur se règle avec linewidth ou son raccourci lw :

python
ax.plot(x, x, lw=1)     # par défaut
ax.plot(x, x+1, lw=3)
ax.plot(x, x+2, lw=0.5)

Styles de lignes

Les styles les plus courants :

CodeDescription
'-'ligne continue
'--'tirets
'-.'tiret-point
':'pointillé
python
ax.plot(x, x, ls='--', lw=2)
ax.plot(x, x+1, ls=':', lw=2)

Marqueurs (points de données)

Les marqueurs représentent les points réels des données.

CodeForme
'o'cercle
's'carré
'+'plus
'^'triangle
'*'étoile
python
ax.plot(x, x, marker='o')

Fichier Python associé

Style
py
import matplotlib.pyplot as plt
import numpy as np

# ===========================================================
# Données
# ===========================================================
x = np.arange(0, 10)
y = 2 * x

# ===========================================================
# LÉGENDES
# ===========================================================
"""
On ajoute une légende en deux étapes :
1) fournir un argument label à chaque tracé
2) appeler la méthode legend() sur l'objet Axes

Attention : la légende peut parfois chevaucher le graphique.
"""

fig, ax = plt.subplots()

ax.plot(x, x**2, label="x²")
ax.plot(x, x**3, label="x³")

# Laisser matplotlib choisir la meilleure position
ax.legend(loc=0)

ax.set_title("Exemple de légende (placement automatique)")
plt.show()


# -----------------------------------------------------------
# Positions possibles de la légende
# -----------------------------------------------------------

positions = {
    1: "coin supérieur droit",
    2: "coin supérieur gauche",
    3: "coin inférieur gauche",
    4: "coin inférieur droit",
}

for loc, description in positions.items():
    fig, ax = plt.subplots()
    ax.plot(x, x**2, label="x²")
    ax.plot(x, x**3, label="x³")
    ax.legend(loc=loc)
    ax.set_title(f"Légende : {description}")
    plt.show()


# ===========================================================
# COULEURS ET STYLES DE LIGNES
# ===========================================================

"""
Matplotlib propose deux syntaxes :
- syntaxe type MATLAB (à éviter si possible)
- arguments par mots-clés (recommandé)
"""

# -----------------------------------------------------------
# Syntaxe type MATLAB (non recommandée)
# -----------------------------------------------------------

fig, ax = plt.subplots()
ax.plot(x, x**2, 'b.-', label="bleu + points")
ax.plot(x, x**3, 'g--', label="vert + tirets")
ax.legend()
ax.set_title("Syntaxe type MATLAB")
plt.show()


# -----------------------------------------------------------
# Approche recommandée : mots-clés
# -----------------------------------------------------------

fig, ax = plt.subplots()

ax.plot(x, x+1, color="blue", alpha=0.5, label="Bleu transparent")
ax.plot(x, x+2, color="#8B008B", label="Violet (hex)")
ax.plot(x, x+3, color="#FF8C00", label="Orange (hex)")

ax.legend()
ax.set_title("Couleurs avec mots-clés")
plt.show()


# ===========================================================
# LARGEUR DES LIGNES
# ===========================================================

fig, ax = plt.subplots(figsize=(10, 5))

ax.plot(x, x-1, lw=0.25, label="lw = 0.25")
ax.plot(x, x-2, lw=0.5, label="lw = 0.5")
ax.plot(x, x-3, lw=1, label="lw = 1")
ax.plot(x, x-4, lw=5, label="lw = 5")

ax.legend()
ax.set_title("Largeur des lignes")
plt.show()


# ===========================================================
# STYLES DE LIGNES
# ===========================================================

fig, ax = plt.subplots(figsize=(10, 5))

ax.plot(x, x-1, ls='-', lw=3, label="trait plein")
ax.plot(x, x-2, ls='-.', lw=3, label="tiret-point")
ax.plot(x, x-3, ls=':', lw=3, label="points")
ax.plot(x, x-4, ls='--', lw=3, label="tirets")

ax.legend()
ax.set_title("Styles de lignes")
plt.show()


# ===========================================================
# TIRETS PERSONNALISÉS
# ===========================================================

fig, ax = plt.subplots(figsize=(10, 5))

line = ax.plot(x, x, lw=4)[0]
line.set_dashes([10, 5])  # 10 points pleins, 5 points vides

ax.set_title("Tirets personnalisés")
plt.show()


fig, ax = plt.subplots(figsize=(10, 5))

line = ax.plot(x, x, lw=4)[0]
line.set_dashes([2, 2, 10, 2])

ax.set_title("Motif de tirets complexe")
plt.show()


# ===========================================================
# MARQUEURS
# ===========================================================

"""
Les marqueurs représentent les points de données.
Documentation :
https://matplotlib.org/stable/api/markers_api.html
"""

fig, ax = plt.subplots(figsize=(10, 5))

ax.plot(x, x-1, marker='+', ms=15, label="+")
ax.plot(x, x-2, marker='o', ms=15, label="o")
ax.plot(x, x-3, marker='s', ms=15, lw=0, label="s (sans ligne)")
ax.plot(x, x-4, marker='1', ms=15, label="1")

ax.legend()
ax.set_title("Types de marqueurs")
plt.show()


# ===========================================================
# MARQUEURS : STYLE AVANCÉ
# ===========================================================

fig, ax = plt.subplots(figsize=(10, 5))

ax.plot(
    x, x,
    marker='s',
    ms=15,
    lw=1,
    color="black",
    markerfacecolor="red",
    markeredgecolor="blue",
    markeredgewidth=4,
    label="Marqueur stylisé"
)

ax.legend()
ax.set_title("Personnalisation avancée des marqueurs")
plt.show()