HOWTO · Matplotlib
Comment faire pivoter le texte des étiquettes des graduations de l’axe X dans Matplotlib
Découvrez cinq façons de faire pivoter les étiquettes des graduations de l’axe des x dans Matplotlib et de les aligner lorsque de longues étiquettes se chevauchent.
Sur cette page
Pour faire pivoter les étiquettes des graduations de l’axe des x dans Matplotlib, transmettez un angle, par exemple rotation=45, à plt.xticks, fig.autofmt_xdate, ax.set_xticklabels, plt.setp ou ax.tick_params. Une rotation de 45 degrés constitue un bon point de départ lorsque de longues étiquettes horizontales se chevauchent. Alignez les étiquettes inclinées avec ha="right" pour que leur extrémité reste près de la graduation correspondante. Les exemples ci-dessous présentent les situations où chaque API est utile.
Sans rotation, les noms de catégorie tels que les mois restent horizontaux et occupent toute la largeur de l’axe, si bien que des noms plus longs ou une figure plus étroite font se toucher les étiquettes voisines :
Faire pivoter les étiquettes des graduations de l’axe des x avec plt.xticks
plt.xticks est une solution concise lorsque vous utilisez pyplot. Son argument rotation définit l’angle en degrés ; par défaut, les étiquettes restent horizontales. Cet exemple trace des catégories et incline leurs étiquettes de 45 degrés.
import matplotlib.pyplot as plt
months = ["January", "February", "March", "April"]
values = [12, 18, 15, 22]
fig, ax = plt.subplots()
ax.plot(months, values, marker="o")
plt.xticks(rotation=45, ha="right")
ax.grid(True)
fig.tight_layout()
Utilisez plt.xticks pour modifier rapidement les graduations des axes courants. Si votre code utilise déjà un objet Axes, les méthodes présentées ci-dessous permettent de désigner explicitement l’axe concerné.
Faire pivoter les étiquettes d’un axe de dates avec fig.autofmt_xdate
Pour les graphiques utilisant des dates, fig.autofmt_xdate met en forme les étiquettes de date de la figure et les incline pour en améliorer la lisibilité. Les valeurs par défaut ajustent également leur alignement ainsi que la marge inférieure ; vous pouvez définir explicitement rotation pour obtenir un angle précis. Le comportement dépend des axes de la figure et du format des dates : utilisez cette méthode pour les axes de dates, plutôt que comme solution générale à tous les réglages d’étiquettes de graduation.
import matplotlib.pyplot as plt
from datetime import date, timedelta
start = date(2024, 1, 1)
dates = [start + timedelta(days=7 * i) for i in range(6)]
values = [3, 5, 4, 7, 6, 9]
fig, ax = plt.subplots()
ax.plot(dates, values, marker="o")
fig.autofmt_xdate(rotation=45)
ax.grid(True)
Cette méthode est pratique lorsque l’axe des x représente des dates et que leurs étiquettes mises en forme doivent être inclinées et espacées. Pour des catégories ordinaires, choisissez l’une des méthodes de réglage des étiquettes présentées dans les autres sections.
Définir les étiquettes et leur rotation avec ax.set_xticklabels
Utilisez ax.set_xticklabels lorsque vous devez fournir un texte personnalisé pour les étiquettes et définir leur rotation. Commencez par définir explicitement les positions des graduations, puis fournissez une étiquette pour chacune d’elles afin que chaque chaîne corresponde à la graduation voulue. Une simple rotation ne nécessite pas de remplacer les étiquettes : utilisez tick_params ou plt.setp pour conserver le texte existant.
import matplotlib.pyplot as plt
positions = [0, 1, 2, 3]
labels = ["North region", "South region", "East region", "West region"]
values = [8, 5, 9, 6]
fig, ax = plt.subplots()
ax.plot(positions, values, marker="o")
ax.set_xticks(positions)
ax.set_xticklabels(labels, rotation=45, ha="right")
ax.grid(True)
fig.tight_layout()
Conservez le même ordre pour les positions et les étiquettes. Si les graduations du graphique changent ensuite, mettez à jour les étiquettes personnalisées pour qu’elles leur correspondent.
Définir les propriétés des étiquettes avec plt.setp
plt.setp modifie les propriétés d’artistes Matplotlib existants, notamment celles des objets correspondant aux étiquettes actuelles de l’axe des x, renvoyés par ax.get_xticklabels(). Cette méthode est utile lorsque les étiquettes sont déjà en place et que vous souhaitez seulement modifier leur apparence.
import matplotlib.pyplot as plt
categories = ["First quarter", "Second quarter", "Third quarter", "Fourth quarter"]
values = [14, 17, 13, 21]
fig, ax = plt.subplots()
ax.plot(categories, values, marker="o")
plt.setp(ax.get_xticklabels(), rotation=45, ha="right")
ax.grid(True)
fig.tight_layout()
Ici, rotation modifie l’angle et ha définit l’alignement horizontal. Les propriétés des objets d’étiquette actuels sont ainsi modifiées sans remplacer leur texte.
Définir la rotation des étiquettes de l’axe des x avec ax.tick_params
ax.tick_params définit les propriétés des graduations, de leurs étiquettes et des lignes de grille pour un axe donné. Transmettez axis="x" et l’argument labelrotation, écrit entièrement en minuscules, pour incliner les étiquettes de l’axe des x tout en conservant leur texte et leur position.
import matplotlib.pyplot as plt
categories = ["Planning", "Development", "Review", "Delivery"]
values = [2, 5, 3, 6]
fig, ax = plt.subplots()
ax.plot(categories, values, marker="o")
ax.tick_params(axis="x", labelrotation=45)
ax.grid(True)
fig.tight_layout()
Utilisez cette méthode au niveau de l’axe lorsque vous disposez déjà d’une référence à un objet Axes. L’argument s’écrit labelrotation, entièrement en minuscules.
Aligner les étiquettes de graduation inclinées
La rotation modifie l’angle des étiquettes, tandis que l’alignement horizontal détermine quelle partie de chacune d’elles se trouve sur sa graduation. Avec ha="right", l’extrémité droite de l’étiquette rejoint la graduation ; avec ha="left", c’est son extrémité gauche ; et avec ha="center", c’est son milieu. Pour des étiquettes inclinées de 45 degrés qui s’étendent vers la gauche à partir de leur graduation, l’alignement à droite est un choix courant. Essayez les différentes options en tenant compte de la longueur des étiquettes et de la disposition du graphique.
import matplotlib.pyplot as plt
positions = [0, 1, 2, 3]
labels = ["January", "February", "March", "April"]
values = [4, 7, 5, 8]
alignments = ["right", "left", "center"]
fig, axes = plt.subplots(1, 3, figsize=(10, 3))
for ax, alignment in zip(axes, alignments):
ax.plot(positions, values, marker="o")
ax.set_xticks(positions)
ax.set_xticklabels(labels, rotation=45, ha=alignment)
ax.set_title(f'ha="{alignment}"')
ax.grid(True)
fig.tight_layout()
Choisissez l’alignement selon le point d’ancrage souhaité pour chaque étiquette. Si elles restent trop serrées, vous pouvez aussi élargir la figure ou raccourcir leur texte.
Corriger les étiquettes coupées et les erreurs de nombre d’étiquettes
Deux échecs restent possibles même lorsque la rotation elle-même fonctionne. D’abord, ax.set_xticklabels remplace le texte des étiquettes, donc le nombre d’étiquettes doit être égal au nombre de positions de repères. Passer trois étiquettes pour quatre positions fait échouer l’appel avant tout tracé :
import matplotlib.pyplot as plt
positions = [0, 1, 2, 3]
labels = ["North", "South", "East"]
values = [8, 5, 9, 6]
fig, ax = plt.subplots()
ax.plot(positions, values, marker="o")
ax.set_xticks(positions)
ax.set_xticklabels(labels, rotation=45, ha="right")
L’appel se termine par cette erreur :
ValueError: The number of FixedLocator locations (4), usually from a call to set_ticks, does not match the number of labels (3).
Ajoutez l’étiquette manquante pour que les deux séquences aient la même longueur, dans le même ordre. Si vous avez seulement besoin de pivoter le texte existant, préférez plt.setp ou ax.tick_params : ils conservent les étiquettes actuelles, donc ce décalage ne peut pas se produire.
Ensuite, la rotation change l’angle mais ne crée pas d’espace sous l’axe. Affichez l’exemple set_xticklabels ci-dessus sans son appel à fig.tight_layout() : les étiquettes pivotées dépassent du bord inférieur de la figure — dans un rendu de taille par défaut, elles dépassent d’environ 31 pixels et sont coupées en plein texte :
fig.tight_layout() recalcule le cadre de la figure pour que chaque étiquette y tienne ; mesurées de la même manière, les étiquettes se terminent alors exactement au bord de la figure, sans rien à l’extérieur. fig.autofmt_xdate effectue le même type d’ajustement de marge pour les axes de dates. Si les étiquettes se chevauchent encore après l’ajustement de la mise en page, raccourcissez le texte des étiquettes ou élargissez la figure plutôt que d’augmenter l’angle.