HOWTO · Matplotlib
Aggiungi un'etichetta dell'asse Y all'asse Y secondario in Matplotlib
Possiamo aggiungere un'etichetta dell'asse y all'asse y secondario in Matplotlib interagendo con l'oggetto assi e utilizzando direttamente il metodo pandas.DataFrame.plot.
In questa pagina
Per etichettare un asse y secondario in Matplotlib, chiama set_ylabel() sull’oggetto axes secondario restituito da Axes.twinx(). L’oggetto axes restituito condivide l’asse x del grafico e fornisce un asse y indipendente sul lato opposto. Scegli etichette descrittive e includi le unità quando aiutano a distinguere le grandezze.
Aggiungere un’etichetta all’asse y secondario con twinx()
Crea il secondo oggetto Axes con ax.twinx(), traccia su di esso la seconda serie e imposta direttamente la relativa etichetta. Questo esempio completo definisce entrambi i colori e usa tight_layout() per lasciare spazio alle etichette.
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()
ax2 è l’oggetto Axes secondario, quindi ax2.set_ylabel(...) colloca l’etichetta sull’asse y destro. Se applichi invece set_ylabel() a ax, modifichi l’etichetta primaria a sinistra. Abbinare il colore delle etichette e delle tacche a quello di ciascuna linea è facoltativo, ma può aiutare a distinguere le due scale.
Quando viene visualizzato il primo esempio, l’asse orizzontale è etichettato Time (s). Una curva sinusoidale blu usa l’asse y sinistro e una curva cosinusoidale arancione usa quello destro. Entrambe coprono gli stessi valori di tempo, mentre ciascuna scala verticale si legge sul proprio lato della figura. Le etichette visibili nel grafico restano in inglese, come nel codice invariato. L’immagine in evidenza dell’articolo mostra gli assi Height e Weight: è un’illustrazione separata e non raffigura queste curve sinusoidale e cosinusoidale.
Personalizzare le etichette degli assi y per renderle chiare
Scegli un testo che indichi la grandezza misurata e la relativa unità, per esempio Temperature (°C) o Pressure (kPa). Lo stile è facoltativo: passa argomenti come color, fontsize o fontweight a set_ylabel() quando migliorano la leggibilità. Mantieni distinte le etichette e non affidarti soltanto al colore per spiegare a quale scala appartengono i dati.
L’esempio seguente applica queste opzioni di stile a un grafico la cui scala sinistra indica la temperatura in gradi Celsius e la scala destra la pressione in kilopascal:
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()
Usa ogni etichetta come breve descrizione dei valori letti su quel lato del grafico, come nell’esempio precedente. Il testo e le unità spiegano il significato dei numeri; abbinare il colore dell’etichetta a quello di una linea è un ulteriore indizio visivo. Se le etichette sono troppo ravvicinate, tight_layout() può regolare la spaziatura della figura, anche se un’etichetta lunga potrebbe richiedere una figura più grande o una formulazione più breve.
Aggiungere un’etichetta all’asse y secondario con DataFrame.plot
Per i dati pandas, quando tracci la seconda serie con secondary_y=True, passa in ax l’oggetto Axes del primo grafico. DataFrame.plot restituisce un oggetto Axes a ogni chiamata: la prima restituisce l’oggetto Axes primario e la seconda quello secondario. Imposta ciascuna etichetta sull’oggetto corrispondente.
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()
Qui secondary_y seleziona la scala destra per il peso, mentre ax=ax sovrappone la serie nella stessa figura. Se usi nomi di colonne o unità diversi, aggiorna sia gli argomenti y sia le etichette affinché descrivano i dati tracciati.
Con i valori di questo esempio, il grafico visualizzato mostra l’età sull’asse orizzontale, Height (cm) a sinistra e Weight (kg) a destra. La linea blu dell’altezza cresce nei quattro valori di età, così come la linea arancione del peso; le due linee si interpretano usando le rispettive etichette e scale degli assi y. Le etichette visibili nel grafico restano in inglese, come nel codice invariato. Le etichette devono corrispondere alle colonne tracciate: aggiornane il testo se cambi le colonne selezionate o le unità. Passare l’oggetto ax esistente mantiene entrambe le serie nella stessa figura, mentre secondary_y=True assegna la seconda serie alla scala sul lato destro.