Skip to content

Correction de savefig de Matplotlib qui coupe les étiquettes : Un guide complet

Vous avez passé des heures à créer le graphique parfait avec Matplotlib, pour découvrir que les étiquettes sont coupées lorsque vous essayez de le sauvegarder en utilisant la fonction savefig. Cela peut être très frustrant, surtout lorsque votre xlabel a une hauteur équivalente à quelques lignes de texte et qu'il n'est tout simplement pas affiché correctement. Mais ne vous inquiétez pas, vous êtes au bon endroit. Dans cet article, nous explorerons plusieurs méthodes pour résoudre le problème où la fonction savefig de Matplotlib coupe les étiquettes.

Comprendre le problème

Avant de commencer à résoudre le problème, comprenons d'abord pourquoi il se produit. Il est courant d'utiliser des étiquettes complexes dans les graphiques scientifiques ou mathématiques, qui sont souvent rendues à l'aide de formules TeX. Ces étiquettes peuvent être "hautes", c'est-à-dire qu'elles couvrent plusieurs lignes, ce qui entraîne la coupure de la partie inférieure de l'étiquette dans le graphique enregistré. Voici un exemple de cas similaire :

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("Exemple avec matplotlib 3.4.2\nMRE n'est plus un problème")
plt.show()

Dans cet exemple, l'étiquette ylabel est visible, mais l'étiquette xlabel est coupée en bas.

La méthode subplots_adjust

Une solution courante à ce problème consiste à ajuster les marges du graphique à l'aide de la fonction subplots_adjust. La fonction subplots_adjust peut être appliquée soit à la figure actuelle obtenue par plt.gcf(), soit directement au graphique en utilisant plt.subplots_adjust(). Voici comment l'utiliser :

plt.gcf().subplots_adjust(bottom=0.15)
# ou
plt.subplots_adjust(bottom=0.15)

Cette méthode ajuste la marge inférieure pour faire de la place à l'étiquette xlabel.

La méthode tight_layout

Matplotlib a introduit la fonction tight_layout qui ajuste automatiquement les paramètres du sous-graphique pour donner un espace de rembourrage spécifié. Cette fonction est géniale car elle permet de résoudre facilement le problème des étiquettes coupées :

fig, axes = plt.subplots(ncols=2, nrows=2, figsize=(8, 6))
axes = axes.flatten()
 
for ax in axes:
    ax.set_ylabel(r"$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$")
    ax.set_xlabel(r"$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$")
 
plt.tight_layout()
plt.show()

En appelant plt.tight_layout(), Matplotlib ajuste automatiquement les axes des sous-graphiques, en veillant à ce que les étiquettes ne se chevauchent pas et ne soient pas coupées.

Enregistrer le graphique avec bbox_inches='tight'

Une autre façon de s'assurer que les étiquettes ne sont pas coupées lors de l'enregistrement du graphique est de spécifier bbox_inches='tight' dans la fonction savefig :

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

Cette option garantit que tous les éléments du graphique, y compris les étiquettes, sont ajustés dans la zone de délimitation lors de l'enregistrement du graphique.

Dans la section suivante, nous approfondirons les paramètres de mise en page automatique de la figure et verrons comment les utiliser pour résoudre notre problème.

Ajustements automatiques de la mise en page

Matplotlib propose une option permettant d'ajuster automatiquement la mise en page de vos graphiques. Cela est particulièrement utile lorsque vous souhaitez que votre code produise des graphiques cohérents sur des machines configurées différemment. Voici comment vous pouvez le faire :

Mise à jour des rcParams pendant l'exécution

Vous pouvez mettre à jour les rcParams pendant l'exécution. Cela vous permet de vous assurer que le paramètre d'ajustement automatique de la mise en page est activé lorsque votre code est exécuté. Voici comment faire :

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

Configuration du fichier matplotlibrc

Alternativement, vous pouvez définir l'ajustement automatique de la mise en page directement dans votre fichier matplotlibrc :

figure.autolayout : True

Ce paramètre est un excellent moyen de garantir la cohérence de vos graphiques sur différentes machines et environnements.

Maintenant, vous devriez avoir une bonne compréhension de la façon de résoudre le problème où la fonction savefig de Matplotlib coupe les étiquettes. N'oubliez pas que la meilleure solution dépendra de vos besoins spécifiques et de vos circonstances, alors n'hésitez pas à expérimenter ces méthodes pour trouver celle qui fonctionne le mieux pour vous.

Alternative à Matplotlib : Visualiser les données avec PyGWalker

En plus d'utiliser Matplotlib pour visualiser votre dataframe pandas, voici une alternative, une bibliothèque python Open Source qui peut vous aider à créer des visualisations de données facilement : PyGWalker (opens in a new tab).

PyGWalker pour la visualisation des données (opens in a new tab)

Plus besoin d'effectuer un traitement compliqué avec du code Python, il vous suffit d'importer vos données et de faire glisser et déposer des variables pour créer toutes sortes de visualisations de données ! Voici une courte vidéo de démonstration de l'opération :


Voici comment utiliser PyGWalker dans votre notebook Jupyter :

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

Vous pouvez également l'essayer dans Kaggle Notebook/Google Colab :

Exécuter PyGWalker dans Kaggle Notebook (opens in a new tab)Exécuter PyGWalker dans Google Colab (opens in a new tab)Donnez un ⭐️ à PyGWalker sur GitHub (opens in a new tab)
Exécuter PyGWalker dans Kaggle Notebook (opens in a new tab)Exécuter PyGWalker dans Google Colab (opens in a new tab)Exécuter PyGWalker dans Google Colab (opens in a new tab)

PyGWalker repose sur le soutien de notre communauté Open Source. N'oubliez pas de consulter le dépôt GitHub de PyGWalker (opens in a new tab) et de nous donner une étoile !

Questions fréquemment posées

  1. Pourquoi mes étiquettes sont-elles coupées lorsque j'utilise la fonction savefig dans Matplotlib ? Cela se produit souvent lorsque vos étiquettes sont "hautes", par exemple lorsqu'elles sont rendues à l'aide de formules TeX et occupent plusieurs lignes. Matplotlib n'ajuste pas automatiquement les marges du graphe pour accueillir ces étiquettes, ce qui les fait être coupées.

  2. Qu'est-ce que la fonction tight_layout dans Matplotlib ? La fonction tight_layout est une fonctionnalité de Matplotlib qui ajuste automatiquement les paramètres des subplots pour donner un espacement spécifié. Elle s'assure que les étiquettes ne se chevauchent pas et ne sont pas coupées.

  3. Que fait bbox_inches='tight' dans la fonction savefig ? L'option bbox_inches='tight' dans la fonction savefig garantit que tous les éléments du graphe, y compris les étiquettes, s'adaptent à l'intérieur de la boîte englobante lors de l'enregistrement du graphe. Cela permet d'éviter que les étiquettes ne soient coupées dans la figure enregistrée.