Skip to content

Corriger les labels coupés par savefig dans Matplotlib : Guide complet 2025

Updated on

Un guide complet et à jour pour corriger les labels coupés par Matplotlib savefig, incluant tight_layout, constrained_layout, bbox_inches, rcParams et les bonnes pratiques modernes.

Si vous avez déjà créé un graphique Matplotlib qui rendait parfaitement dans votre notebook — mais qui était coupé, tronqué ou avec des labels manquants après l’export avec savefig() — vous n’êtes pas seul.

C’est l’une des frustrations les plus fréquentes avec Matplotlib, en particulier lorsque vous utilisez :

  • Des labels rendus avec LaTeX et très hauts
  • Des titres sur plusieurs lignes
  • Des labels de graduations longs ou pivotés
  • Des sous-graphiques avec un espacement très serré

Dans ce guide mis à jour, vous allez découvrir toutes les méthodes fiables pour que vos figures sauvegardées incluent toujours labels, titres et annotations — avec des bonnes pratiques modernes sur lesquelles vous pouvez compter.


🧠 Pourquoi ce problème apparaît

Matplotlib n’agrandit pas automatiquement la zone de la figure lorsque les labels dépassent des axes.
Les causes courantes incluent :

  • Des expressions de style LaTeX qui produisent des symboles très hauts
  • Des valeurs de fontsize importantes
  • Des labels de graduations longs ou pivotés
  • Des grilles de sous-graphiques très serrées

Exemple :

matplotlib-savefig-label-clipping-example

import matplotlib.pyplot as plt
 
plt.figure()
plt.ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
plt.xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$', fontsize=50)
plt.title('Example with matplotlib 3.4.2\nLabel clipping example')
plt.show()

Le label de l’axe Y est visible, mais celui de l’axe X sera souvent coupé dans la figure sauvegardée.


✅ 1. Meilleure solution moderne (recommandée) : utiliser constrained_layout=True

Depuis Matplotlib 3.6+ (et toujours en 3.8+ en 2025), la méthode de mise en page recommandée est :

fig, ax = plt.subplots(constrained_layout=True)

Exemple :

matplotlib-constrained-layout-example.png

fig, ax = plt.subplots(figsize=(7, 5), constrained_layout=True)
ax.set_xlabel("Very long bottom label that usually gets clipped", fontsize=16)
ax.set_ylabel("Tall math label:\n$\\frac{x_a - x_b}{x_c}$")
fig.savefig("figure.png")

✔ Avantages

  • Moderne et stable
  • Fonctionne mieux que tight_layout()
  • Gère bien colorbars, légendes et sous-graphiques

⚠ Inconvénients

  • Légèrement plus lent sur de grandes grilles de sous-graphiques

Si vous écrivez du nouveau code Matplotlib en 2025, cela devrait être votre choix par défaut.


✅ 2. Ajuster les marges manuellement avec subplots_adjust

Une méthode toujours simple et efficace :

plt.subplots_adjust(bottom=0.15)

Ou directement sur la figure :

plt.gcf().subplots_adjust(bottom=0.18)

Augmentez la valeur de marge jusqu’à ce que les labels ne se chevauchent plus.

matplotlib-subplots-adjust-margins.png


✅ 3. Utiliser tight_layout() (plus ancien mais encore utile)

tight_layout() ajuste automatiquement les espacements :

fig, axes = plt.subplots(ncols=2, nrows=2, figsize=(8, 6))
for ax in axes.flatten():
    ax.set_xlabel("Example X label")
    ax.set_ylabel("Example Y label")
 
plt.tight_layout()
plt.show()

Remarques

  • Bon pour les graphiques simples
  • Peut mal gérer les légendes et colorbars
  • constrained_layout=True est maintenant la solution à privilégier

✅ 4. Sauvegarder avec bbox_inches="tight" (excellent correctif rapide)

Une solution très utilisée contre le rognage :

plt.savefig("myfile.png", bbox_inches="tight")

Quand l’utiliser

  • Correctif rapide sans modifier la mise en page
  • Garantit que tout ce qui apparaît à l’écran apparaît aussi dans le fichier

matplotlib-tight-layout-subplots.png


✅ 5. Activer la mise en page automatique avec rcParams

Si vous voulez une solution permanente qui s’applique à tous les graphiques : matplotlib-bbox-inches-tight-example.png

Mettre à jour rcParams à l’exécution :

from matplotlib import rcParams
rcParams.update({"figure.autolayout": True})

OU configurer matplotlibrc :

figure.autolayout : True

Cela aide à garantir un rendu cohérent entre différentes machines.


📌 Tableau récapitulatif : quelle méthode utiliser ?

MéthodeQuand l’utiliserIdéal pour
constrained_layout=True**Choix par défaut **Mise en page moderne, subplots, légendes
bbox_inches='tight'Correctif rapide lors de la sauvegardeExport de graphiques simples
tight_layout()Code existant / héritéGrilles de sous-graphiques simples
subplots_adjust()Vous voulez un contrôle manuel totalAjustements de type publication
figure.autolayout=TrueValeur par défaut à l’échelle d’un projetCohérence entre systèmes

💡 Conseils supplémentaires pour des figures impeccables

✔ Utiliser un DPI plus élevé pour réduire les découpes avec des labels longs

plt.savefig("fig.png", dpi=200, bbox_inches="tight")

✔ Éviter les tailles de police énormes sauf nécessité

Des polices très grandes augmentent le risque de rognage des labels.

✔ Pour les colorbars : utiliser constrained_layout

Cela fonctionne nettement mieux que tight_layout.


📊 Créer des visualisations sans ajuster la mise en page à la main (PyGWalker)

Si vous utilisez Matplotlib surtout pour visualiser des DataFrames, vous n’avez peut‑être plus besoin d’ajuster manuellement les mises en page.

Vous pouvez simplement :

  • Charger votre DataFrame
  • Glisser‑déposer les champs
  • Générer instantanément les graphiques

En utilisant PyGWalker, un outil de visualisation open‑source :

PyGWalker for Data visualization (opens in a new tab)

Voici comment l’utiliser :

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

Ou essayez‑le en ligne :

KaggleGoogle ColabGitHub

❓ Foire aux questions

  1. Pourquoi mes labels sont-ils coupés quand je sauvegarde une figure Matplotlib ?
    Parce que Matplotlib n’agrandit pas automatiquement la zone de la figure lorsque les labels dépassent les limites des axes. C’est fréquent avec des labels LaTeX ou du texte pivoté.

  2. Quelle méthode corrige le plus fiablement le rognage des labels en 2025 ?
    Utilisez constrained_layout=True pour du code moderne, ou bbox_inches='tight' comme correctif rapide lors de l’export.

  3. Que fait bbox_inches="tight" ?
    Cela recalcule la boîte englobante lors de la sauvegarde, en s’assurant que tous les éléments textuels sont inclus.