HOWTO · Matplotlib

Aggiungi testo all'interno del grafico in Matplotlib

Questo tutorial mostra come usare la funzione `matplotlib.pyplot.text()` per aggiungere testo a una figura o agli assi in Matplotlib.

In questa pagina

Usa matplotlib.pyplot.text() per posizionare un’etichetta o una nota in un punto scelto all’interno di un grafico Matplotlib. La funzione riceve le coordinate x e y seguite dalla stringa da mostrare; gli argomenti facoltativi controllano l’aspetto del testo. Ad esempio, plt.text(2, 20, "Peak point") posiziona un’etichetta alla coordinata dati (2, 20). Con un oggetto axes, usa la chiamata equivalente ax.text(2, 20, "Peak point"). Consulta la documentazione API di pyplot.text() per l’elenco completo dei parametri.

Usa matplotlib.pyplot.text() per aggiungere testo a un grafico

L’esempio seguente disegna una linea e posiziona un’etichetta su uno dei suoi punti dati. Utilizza l’interfaccia pyplot e imposta l’intervallo visualizzato in modo che le coordinate scelte rientrino nel grafico.

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [10, 15, 25, 30]

plt.plot(x, y, marker="o")
plt.xlim(0, 5)
plt.ylim(0, 35)
plt.text(3, 25, "Peak point", fontsize=12, color="crimson")
plt.title("A labeled line plot")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

Grafico a linee di quattro punti con l’etichetta cremisi Peak point posizionata sul punto dati (3, 25).

x e y contengono i dati tracciati e la chiamata posiziona “Peak point” alla coordinata (3, 25). Le due chiamate per i limiti includono tale coordinata nell’intervallo visibile. Per gli script che creano più grafici, ax.text(x, y, label) collega il testo a uno specifico oggetto axes e rende chiaro quale grafico lo riceve. La chiamata pyplot è comoda per un singolo grafico corrente. L’etichetta “Peak point” resta in inglese nel codice invariato.

Posiziona il testo con le coordinate dei dati e i limiti degli assi

Per impostazione predefinita, gli argomenti x e y di text() utilizzano le coordinate dei dati. Un’etichetta in (3, 25) segue quindi quei valori sul grafico; non è posizionata in base alla distanza in pixel da un angolo. I limiti correnti di x e y determinano quale parte del piano delle coordinate dei dati è visibile. Imposta limiti adeguati con plt.xlim() e plt.ylim(), oppure usa ax.set_xlim() e ax.set_ylim() con un oggetto axes.

Scegli una posizione che mantenga l’etichetta leggibile e non copra dati importanti. Per una nota che deve rimanere a una frazione fissa degli assi indipendentemente dai valori dei dati, usa le coordinate degli assi tramite transform=ax.transAxes; (0, 0) è l’angolo inferiore sinistro e (1, 1) l’angolo superiore destro degli assi. Ciò differisce dalle coordinate dei dati predefinite ed è utile per le didascalie ancorate all’interno di un grafico. L’esempio seguente combina entrambi i sistemi: l’etichetta dati resta in (3, 25), mentre la nota di bozza resta nell’angolo superiore sinistro degli assi anche se i dati o i limiti cambiano.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 15, 25, 30], marker="o")
ax.set_xlim(0, 5)
ax.set_ylim(0, 35)
ax.text(3, 25, "Peak point", fontsize=12, color="crimson")
ax.text(0.02, 0.95, "Draft - internal data", transform=ax.transAxes,
        fontsize=10, ha="left", va="top")
ax.set_title("Data and axes coordinates")
plt.show()

Grafico a linee con Peak point sul punto dati (3, 25) e la nota Draft - internal data fissata nell’angolo superiore sinistro degli assi.

Un caso limite sorprende molti utenti: il testo è ancorato alle sue coordinate, ma per impostazione predefinita non viene ritagliato agli assi. Un’etichetta che inizia all’interno del grafico può oltrepassare il bordo degli assi nel margine, e un’etichetta ancorata fuori dai limiti viene disegnata fuori dall’area degli assi. Passa clip_on=True per tagliare il testo esattamente al bordo degli assi. L’esempio inizia due etichette identiche a x = 4,6, vicino al bordo destro a x = 5:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 15, 25, 30], marker="o")
ax.set_xlim(0, 5)
ax.set_ylim(0, 35)
ax.text(4.6, 32, "Clipped at the edge", fontsize=12, clip_on=True)
ax.text(4.6, 27, "Drawn in full", fontsize=12)
ax.set_title("Text at the axes edge")
plt.show()

Grafico a linee con due etichette che iniziano a x uguale a 4,6 vicino al bordo destro: la prima, con clip_on uguale a True, viene tagliata al bordo degli assi, mentre la seconda viene disegnata per intero attraverso il margine.

La prima etichetta si ferma al bordo destro degli assi; la seconda continua nel margine. Se un’etichetta deve rimanere leggibile, mantieni il suo ancoraggio e la sua intera larghezza entro i limiti — amplia i limiti o sposta l’ancoraggio — invece di affidarti al ritaglio, che rimuove l’eccesso senza avvisare. Le etichette “Clipped at the edge” e “Drawn in full” restano in inglese, come tutto il codice.

Personalizza l’aspetto del testo

Passa argomenti con parola chiave a text() per definire lo stile di un’etichetta. fontsize ne modifica la dimensione, color ne imposta il colore e fontweight="bold" la mette in risalto. Imposta rotation per ruotare il testo e usa horizontalalignment (o ha) e verticalalignment (o va) per allinearlo attorno alle sue coordinate x e y. Ad esempio, ha="center" e va="bottom" centrano un’etichetta sopra un punto mantenendola al di sopra di esso.

Un argomento bbox aggiunge uno sfondo dietro il testo, che può separare un’etichetta da una linea o da un marcatore affollati. Accetta un dizionario di proprietà della patch. Questo esempio combina allineamento, enfasi, rotazione e un riquadro bianco traslucido:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [2, 4, 3], marker="o")
ax.set_ylim(1.8, 4.7)
ax.text(2, 4, "Peak", fontsize=12, color="crimson", fontweight="bold",
        ha="center", va="bottom", rotation=15,
        bbox={"facecolor": "white", "alpha": 0.8})
ax.set_title("Styled text")
plt.show()

Piccolo grafico a linee con l’etichetta Peak in grassetto e colore cremisi, ruotata di 15 gradi, centrata sopra il punto centrale su un riquadro di sfondo bianco traslucido.

Ad esempio, bbox={"facecolor": "white", "alpha": 0.8} crea uno sfondo bianco parzialmente trasparente. Usa solo le opzioni che migliorano la leggibilità; colori forti, caratteri grandi o rotazioni possono competere con i dati se applicati in modo esteso. L’etichetta mostrata nell’esempio di codice invariato resta in inglese.

Aggiungi annotazioni e testo su più righe

Usa plt.annotate() quando una nota deve indicare un elemento. Il suo argomento xy identifica il punto dati descritto, mentre xytext indica la posizione del testo. Anche la posizione del testo dell’annotazione usa per impostazione predefinita le coordinate dei dati; imposta limiti che includano sia l’obiettivo sia la nota. Con gli axes, usa ax.annotate() in modo che l’obiettivo e la nota appartengano al grafico desiderato.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 15, 25, 30], marker="o")
ax.set_xlim(0, 5)
ax.set_ylim(0, 35)
ax.annotate("Peak", xy=(3, 25), xytext=(1.2, 31),
            arrowprops={"arrowstyle": "->"})
ax.set_title("Annotation with an arrow")
plt.show()

Grafico a linee con l’annotazione Peak sopra la linea e una freccia che punta dalla nota al punto dati (3, 25).

Qui arrowprops={"arrowstyle": "->"} disegna la freccia dalla nota in (1,2, 31) al picco in (3, 25). Senza arrowprops, annotate() posiziona testo semplice in modo molto simile a text().

Per una nota su più righe, includi i caratteri di nuova riga nella stringa passata a text(), ad esempio "First line\nSecond line". Matplotlib visualizza ciascun segmento su una riga propria alla posizione selezionata. Un’etichetta su più righe è utile per una spiegazione compatta; regolane posizione e allineamento in modo che rimanga all’interno dell’area visibile del grafico e non oscuri i dati vicini.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 15, 25, 30], marker="o")
ax.set_xlim(0, 5)
ax.set_ylim(0, 35)
ax.text(0.4, 33, "First line\nSecond line", fontsize=12, va="top")
ax.set_title("Multi-line text")
plt.show()

Grafico a linee con l’etichetta su due righe First line e Second line impilate nella parte superiore sinistra dell’area del grafico.

Con va="top", la coordinata y (33) ancora la parte superiore del blocco di due righe, in modo che entrambe le righe restino all’interno del grafico. Le etichette “Peak”, “First line” e “Second line” restano in inglese negli esempi invariati. Queste tecniche ti permettono di aggiungere etichette, contesto e indicatori mantenendo ogni nota legata alle coordinate o all’elemento che descrive.