HOWTO · Matplotlib

Comment ajouter une étiquette sur l'axe des y à l'axe des y secondaire dans Matplotlib

Nous pouvons ajouter une étiquette d'axe y à l'axe y secondaire dans Matplotlib en interagissant avec l'objet axes et en utilisant directement la méthode pandas.DataFrame.plot.

Sur cette page

Pour ajouter une étiquette à l’axe y secondaire dans Matplotlib, appelez set_ylabel() sur l’objet axes secondaire renvoyé par Axes.twinx(). Cet objet partage l’axe x du graphique et fournit un axe y indépendant, placé du côté opposé. Choisissez des étiquettes descriptives et ajoutez les unités lorsqu’elles aident à distinguer les grandeurs.

Ajouter une étiquette à l’axe y secondaire avec twinx()

Créez le deuxième objet axes avec ax.twinx(), tracez-y la deuxième série, puis définissez directement son étiquette. Cet exemple complet définit les deux couleurs et utilise tight_layout() pour laisser de la place aux étiquettes.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 5, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), color="tab:blue")
ax.set_xlabel("Time (s)")
ax.set_ylabel("sin(x)", color="tab:blue")
ax.tick_params(axis="y", labelcolor="tab:blue")

ax2 = ax.twinx()
ax2.plot(x, np.cos(x), color="tab:orange")
ax2.set_ylabel("cos(x)", color="tab:orange")
ax2.tick_params(axis="y", labelcolor="tab:orange")

fig.tight_layout()
plt.show()

Graphique avec sin(x) comme étiquette de l’axe y bleu de gauche et cos(x) comme étiquette de l’axe y secondaire orange de droite ; les deux courbes sont tracées en fonction de Time (s).

ax2 est l’objet axes secondaire : ax2.set_ylabel(...) place donc l’étiquette sur l’axe y de droite. En appelant plutôt set_ylabel() sur ax, vous modifiez l’étiquette de l’axe principal, à gauche. Assortir la couleur des étiquettes et des graduations à celle de chaque courbe est facultatif, mais peut aider à distinguer les deux échelles.

Lorsque le premier exemple est affiché, l’axe horizontal porte l’étiquette Time (s). Une courbe sinusoïdale bleue utilise l’axe y de gauche, et une courbe cosinusoïdale orange celui de droite. Les deux courbes couvrent les mêmes valeurs de temps, mais chaque échelle verticale se lit du côté correspondant du graphique. L’image principale de cet article montre des axes Height et Weight : c’est une illustration distincte, qui ne représente pas ces courbes sinusoïdales.

Personnaliser les étiquettes de l’axe y pour plus de clarté

Choisissez un texte qui indique la grandeur mesurée et son unité, par exemple Temperature (°C) ou Pressure (kPa). La mise en forme est facultative : transmettez à set_ylabel() des arguments tels que color, fontsize ou fontweight lorsqu’ils améliorent la lisibilité. Veillez à distinguer les étiquettes et ne comptez pas uniquement sur la couleur pour indiquer à quelle échelle appartiennent les données.

L’exemple suivant applique ces options de mise en forme à un graphique dont l’échelle de gauche indique la température en degrés Celsius et celle de droite la pression en kilopascals :

import matplotlib.pyplot as plt
import numpy as np

hours = np.arange(0, 24, 2)
temperature = 18 + 4 * np.sin((hours - 9) * np.pi / 12)
pressure = 101.3 + 0.8 * np.cos((hours - 6) * np.pi / 12)

fig, ax = plt.subplots()
ax.plot(hours, temperature, color="tab:red", marker="o")
ax.set_xlabel("Hour of day")
ax.set_ylabel(
    "Temperature (°C)", color="tab:red", fontsize=12, fontweight="bold"
)
ax.tick_params(axis="y", labelcolor="tab:red")

ax2 = ax.twinx()
ax2.plot(hours, pressure, color="tab:green", marker="s")
ax2.set_ylabel(
    "Pressure (kPa)", color="tab:green", fontsize=12, fontweight="bold"
)
ax2.tick_params(axis="y", labelcolor="tab:green")

fig.tight_layout()
plt.show()

Graphique avec une étiquette rouge en gras Temperature (°C) sur l’axe y de gauche et une étiquette verte en gras Pressure (kPa) sur l’axe y secondaire de droite.

Considérez chaque étiquette comme une brève description des valeurs lues de ce côté du graphique, comme dans l’exemple ci-dessus. Le texte et les unités expliquent la signification des nombres ; assortir la couleur de l’étiquette à celle d’une courbe constitue un repère visuel supplémentaire. Si les étiquettes se chevauchent, tight_layout() peut ajuster l’espacement du graphique. Une étiquette longue peut toutefois nécessiter une figure plus grande ou une formulation plus courte.

Ajouter une étiquette à l’axe y secondaire avec DataFrame.plot

Avec des données pandas, transmettez à ax l’objet axes du premier tracé lorsque vous tracez la deuxième série avec secondary_y=True. Chaque appel à DataFrame.plot renvoie un objet axes : le premier appel renvoie l’axe principal et le second, l’axe secondaire. Définissez chaque étiquette sur l’objet correspondant.

import matplotlib.pyplot as plt
import pandas as pd

frame = pd.DataFrame({
    "age": [10, 20, 30, 40],
    "height": [120, 140, 160, 170],
    "weight": [30, 45, 60, 70],
})

ax = frame.plot(x="age", y="height", color="tab:blue")
ax2 = frame.plot(
    x="age", y="weight", secondary_y=True, ax=ax, color="tab:orange"
)
ax.set_ylabel("Height (cm)")
ax2.set_ylabel("Weight (kg)")
plt.tight_layout()
plt.show()

Graphique pandas DataFrame.plot avec Height (cm) sur l’axe y de gauche et Weight (kg) sur l’axe y secondaire de droite ; les deux séries sont tracées en fonction de age.

Ici, secondary_y choisit l’échelle de droite pour le poids, tandis que ax=ax superpose cette série dans la même figure. Si vous utilisez d’autres noms de colonnes ou unités, mettez à jour les arguments y et les étiquettes pour qu’ils décrivent les données tracées.

Pour les valeurs de cet exemple, le graphique affiché présente l’âge sur l’axe horizontal, Height (cm) à gauche et Weight (kg) à droite. La courbe bleue de la taille monte au fil des quatre âges, tout comme la courbe orange du poids ; chacune se lit à l’aide de sa propre étiquette et de sa propre échelle y. Les étiquettes doivent correspondre aux colonnes réellement tracées : adaptez-les si vous changez les colonnes sélectionnées ou les unités. Transmettre l’objet ax existant maintient les deux séries dans une même figure, tandis que secondary_y=True place la deuxième série sur l’échelle de droite.