HOWTO · Matplotlib

Come posizionare la legenda fuori dagli assi in Matplotlib

Scopri come posizionare una legenda Matplotlib fuori dagli assi e mantenerla visibile nelle figure salvate.

In questa pagina

Per posizionare una legenda Matplotlib fuori dagli assi, usa bbox_to_anchor insieme a loc. Per esempio, ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1)) ancora l’angolo superiore sinistro della legenda appena oltre il bordo superiore destro degli assi. Nel sistema di coordinate predefinito degli assi, (0, 0) indica l’angolo inferiore sinistro e (1, 1) quello superiore destro.

Esempio di bbox_to_anchor

Usa bbox_to_anchor con due valori per collocare la legenda appena oltre gli assi. Con Axes.legend, la coppia rappresenta un punto di ancoraggio nelle coordinate degli assi; loc allinea a quel punto l’angolo corrispondente della legenda. L’esempio completo seguente traccia due curve etichettate e riserva spazio nella figura per la legenda.

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))
fig.subplots_adjust(right=0.78)
plt.close(fig)

Esempio di legenda Matplotlib con bbox_to_anchor

Per un posizionamento più preciso, bbox_to_anchor accetta anche la tupla (x0, y0, width, height). Questa definisce un riquadro di ancoraggio, non le dimensioni della legenda: (x0, y0) è l’angolo inferiore sinistro del riquadro, mentre width e height ne specificano le dimensioni nelle coordinate degli assi. loc sceglie quale punto della legenda allineare al punto corrispondente del riquadro. Per esempio, loc="upper left" allinea l’angolo superiore sinistro della legenda a quello superiore sinistro del riquadro. Tra i valori stringa più comuni ci sono "upper right", "lower left", "center" e "best"; Matplotlib accetta anche i relativi codici numerici, da 0 per "best" a 10 per "center".

tight_layout() regola i parametri dei subplot per lasciare spazio agli elementi decorativi degli assi, come etichette e titoli. Non riserva in modo affidabile lo spazio per una legenda esterna in ogni configurazione. Per mantenerla visibile nella finestra, lascia spazio con fig.subplots_adjust(right=...) oppure scegli una disposizione che possa contenere sia gli assi sia la legenda. La prima immagine mostra una legenda esterna; quella del risultato ritagliato illustra cosa può accadere se la figura non le lascia spazio.

Legenda Matplotlib con bbox_to_anchor ritagliata

bbox_extra_artists e bbox_inches per evitare il ritaglio della legenda

Quando salvi una figura, passa la legenda esterna in bbox_extra_artists e imposta bbox_inches="tight". In questo modo, durante il calcolo del riquadro di delimitazione stretto della figura, il salvataggio considera anche la legenda e la include nell’immagine esportata. Questo esempio è stato completato correttamente e salva il PNG in una directory temporanea. Non produce output standard né messaggi di errore.

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
from tempfile import TemporaryDirectory

x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
legend = ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))

with TemporaryDirectory() as directory:
    output_path = Path(directory) / "example.png"
    fig.savefig(
        output_path,
        dpi=300,
        format="png",
        bbox_extra_artists=(legend,),
        bbox_inches="tight",
    )

plt.close(fig)

bbox_extra_artists riceve gli artisti da includere nel calcolo del riquadro di delimitazione stretto di Matplotlib. bbox_inches="tight" chiede a savefig di usare il riquadro così calcolato per l’immagine salvata. Queste opzioni risolvono il ritaglio durante l’esportazione; non ridimensionano né riposizionano la legenda all’interno degli assi.

L’esempio di salvataggio è terminato con codice di uscita 0; sia l’output standard sia quello di errore sono vuoti, quindi non c’è output visibile da mostrare.