HOWTO · Matplotlib

Aggiungi titolo alle sottotrame in Matplotlib

Possiamo aggiungere un titolo alle sottotrame in Matplotlib usando Axes.set_title(), Axes.title.set_text() o gli assi correnti di pyplot (plt.gca()).

In questa pagina

Per assegnare un titolo a ogni sottotrama, chiama Axes.set_title() sull’asse corrispondente. È la scelta più chiara quando crei più grafici insieme, perché ogni titolo rimane associato all’asse che descrive. Il titolo di una sottotrama appartiene a un singolo asse; usa un titolo a livello di figura, come fig.suptitle(), quando un’unica intestazione deve descrivere l’intera figura.

Aggiungere titoli alle sottotrame con Axes.set_title()

Quando imposti squeeze=False, plt.subplots() restituisce una figura e un array di assi. L’esempio seguente traccia quattro serie, abbina ogni asse a un’etichetta descrittiva e sistema il layout prima di visualizzare la figura. In questo modo axes resta bidimensionale per una griglia 2×2, una sola riga (1×N), una sola colonna (N×1) o una singola sottotrama (1×1). Per una griglia di dimensioni diverse, modifica gli argomenti di plt.subplots() e fornisci un titolo per ogni asse.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)
series = [np.sin(x), np.cos(x), np.sin(2 * x), np.cos(2 * x)]
titles = ["Sine", "Cosine", "Sine, double frequency", "Cosine, double frequency"]

fig, axes = plt.subplots(2, 2, figsize=(8, 5), squeeze=False)
for ax, y, title in zip(axes.flat, series, titles):
    ax.plot(x, y)
    ax.set_title(title)

fig.tight_layout()
plt.show()

Una griglia 2×2 di sottotrame con titoli impostati tramite Axes.set_title(): Sine, Cosine, Sine double frequency e Cosine double frequency, ogni titolo centrato sopra la propria curva.

Poiché squeeze=False mantiene gli assi in un array bidimensionale anche con una griglia 1×1, axes.flat li attraversa in modo uniforme per tutte e quattro le configurazioni: 2×2, 1×N, N×1 e 1×1. zip() abbina ciascun asse e ciascuna serie di dati a un titolo: mantieni quindi queste raccolte nello stesso ordine e con la stessa lunghezza.

L’argomento label specifica il testo visualizzato sopra un asse. Puoi passare anche opzioni come fontsize o loc per controllare l’aspetto e la posizione del titolo. Mantieni concisi i titoli lunghi; se i titoli adiacenti o le etichette hanno poco spazio, aumenta le dimensioni della figura o regola la spaziatura prima di visualizzarla. tight_layout() è un buon punto di partenza, anche se una figura con molti elementi decorativi potrebbe richiedere ulteriori regolazioni della spaziatura.

Impostare i titoli delle sottotrame con Axes.title.set_text()

Un asse espone il proprio titolo anche come oggetto di testo. Usa Axes.title.set_text() per impostare o aggiornare quel testo dopo aver creato l’asse. Può essere utile se il programma conserva già un riferimento all’oggetto titolo o se il testo deve cambiare in seguito. Per configurare il grafico inizialmente, in genere Axes.set_title() è più diretto e rende chiara l’operazione nel punto in cui la applichi all’asse.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)

fig, axes = plt.subplots(1, 2, figsize=(8, 3.5), squeeze=False)
axes[0, 0].plot(x, np.sin(x))
axes[0, 1].plot(x, np.cos(x))

axes[0, 0].title.set_text("Sine")
axes[0, 1].title.set_text("Cosine")

fig.tight_layout()
plt.show()

Due sottotrame affiancate i cui titoli sono stati impostati con Axes.title.set_text(): Sine sopra la curva seno e Cosine sopra la curva coseno.

Per esempio, dopo aver creato un asse chiamato ax, chiama ax.title.set_text("Updated title"). In questo modo aggiorni il titolo di quell’asse; non imposti il titolo di ogni sottotrama della figura. Se ci sono più assi, seleziona esplicitamente quello da aggiornare oppure iterali insieme alle rispettive stringhe, come nel primo esempio. Entrambe le API impostano il titolo dell’asse: scegli uno stile per ogni operazione, senza assegnare due volte lo stesso titolo.

Impostare i titoli delle sottotrame con gli assi correnti di pyplot

Se usi l’interfaccia di pyplot basata sullo stato, plt.gca() restituisce l’asse corrente. Puoi impostarne il titolo con plt.gca().set_title("Title"); la forma equivalente con l’oggetto di testo è plt.gca().title.set_text("Title"). Le parentesi sono importanti: gca() è una chiamata di funzione che restituisce l’asse corrente. Queste forme agiscono solo sull’asse corrente in quel momento, quindi sono utili quando tracci un asse alla volta.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)
series = [np.sin(x), np.cos(x), np.sin(2 * x), np.cos(2 * x)]
titles = ["Sine", "Cosine", "Sine, double frequency", "Cosine, double frequency"]

plt.figure(figsize=(8, 5))
for position, (y, title) in enumerate(zip(series, titles), start=1):
    plt.subplot(2, 2, position)
    plt.plot(x, y)
    plt.gca().set_title(title)

plt.tight_layout()
plt.show()

La stessa griglia 2×2 di curve seno e coseno, costruita in un ciclo con plt.subplot() e plt.gca().set_title(), con un titolo sopra ogni sottotrama.

Per una griglia, seleziona ogni sottotrama prima di impostarne il titolo. Per esempio, plt.subplot(2, 2, position) seleziona una posizione da uno a quattro; poi plt.gca().set_title(title) applica il titolo all’asse selezionato. Se crei la griglia con fig, axes = plt.subplots(...), usare i riferimenti agli assi restituiti è di solito più facile da seguire e dipende meno dallo stato corrente di pyplot.

Completa la configurazione della figura prima di chiamare plt.show(). In particolare, chiama plt.tight_layout() prima della visualizzazione, così il layout può tenere conto dei titoli delle sottotrame. Le etichette visibili nei grafici restano in inglese perché il codice è conservato invariato.

Correggere titoli sovrapposti o tagliati e titoli mancanti

Un titolo è centrato sopra il proprio asse, quindi un titolo lungo può essere più largo dell’asse stesso. Con i due titoli usati nell’esempio seguente, su una figura di dimensioni (8, 3.5), i riquadri dei titoli misurati si sovrappongono di 15 pixel quando non viene applicato nessun aggiustamento del layout, così la fine di un titolo invade l’inizio del successivo. Chiamare fig.tight_layout() li separa — la stessa misurazione lascia allora uno spazio di 39 pixel — ma tight_layout() si limita a ridistribuire lo spazio tra le sottotrame; non riduce il testo del titolo. A quelle dimensioni, il secondo titolo si estende quindi di 11 pixel oltre il bordo destro della figura e viene tagliato nell’output renderizzato. La correzione completa consiste nel dare spazio ai titoli: mantieni tight_layout() e allarga la figura, come in questo esempio, oppure accorcia i titoli. Anche ridurre la fontsize del titolo a 11 mantenendo le dimensioni originali porta entrambi i titoli interamente dentro la figura.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)

fig, axes = plt.subplots(1, 2, figsize=(9, 3.5), squeeze=False)
axes[0, 0].plot(x, np.sin(x))
axes[0, 1].plot(x, np.cos(x))
axes[0, 0].set_title("Sine wave measured at the first sensor")
axes[0, 1].set_title("Cosine wave measured at the second sensor")

fig.tight_layout()
plt.show()

Due sottotrame con i titoli lunghi Sine wave measured at the first sensor e Cosine wave measured at the second sensor, interamente visibili e separati dopo aver allargato la figura e applicato tight_layout().

Con le dimensioni (9, 3.5), entrambi i titoli terminano dentro la figura, con spazio tra loro, e nessun testo viene tagliato. Un titolo mancante, invece, fallisce in silenzio: i cicli di questo articolo abbinano assi e titoli tramite zip(), e zip() si ferma alla sequenza più corta senza sollevare errori. Fornendo tre titoli per le quattro sottotrame di una griglia 2×2, il quarto asse resta con un titolo vuoto — rileggendolo con ax.get_title() si ottiene una stringa vuota — e nessun avviso lo segnala. Quando una sottotrama appare senza titolo, conta i titoli rispetto agli assi prima di controllare le chiamate ai titoli stesse.