2012-03-10 11 views
24

Sto tentando di creare una trama con una legenda sul lato di essa usando matplotlib. Vedo che la trama è in fase di creazione, ma i limiti dell'immagine non consentono di visualizzare l'intera legenda.La mia legenda matplotlib.pyplot viene interrotta

lines = [] 
ax = plt.subplot(111) 
for filename in args: 
    lines.append(plt.plot(y_axis, x_axis, colors[colorcycle], linestyle='steps-pre', label=filename)) 
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) 

Questo produce: enter image description here

+0

[Questa risposta] (https://stackoverflow.com/a/43439132/4124317) fornisce una panoramica su diverse tecniche che possono essere utilizzate per far apparire la legenda all'interno dei limiti delle figure. – ImportanceOfBeingErnest

risposta

16

Come sottolineato da Adam, è necessario fare spazio sul lato del grafico. Se si desidera ottimizzare lo spazio necessario, si consiglia di esaminare il metodo add_axes di matplotlib.pyplot.artist.

Ecco un rapido esempio:

import matplotlib.pyplot as plt 
import numpy as np 

# some data 
x = np.arange(0, 10, 0.1) 
y1 = np.sin(x) 
y2 = np.cos(x) 

# plot of the data 
fig = plt.figure() 
ax = fig.add_axes([0.1, 0.1, 0.6, 0.75]) 
ax.plot(x, y1,'-k', lw=2, label='black sin(x)') 
ax.plot(x, y2,'-r', lw=2, label='red cos(x)') 
ax.set_xlabel('x', size=22) 
ax.set_ylabel('y', size=22) 
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) 

plt.show() 

e l'immagine risultante: image

+50

So che a Matplotlib piace dire che tutto è sotto il controllo dell'utente, ma questa intera cosa con le leggende è troppo di una cosa buona. Se metto la legenda all'esterno, desidero che sia ancora visibile. La finestra dovrebbe ridimensionarsi per adattarsi invece di creare questo enorme problema di rescaling. Per lo meno dovrebbe esserci un'opzione True predefinita per controllare questo comportamento di scalabilità automatica. Costringere gli utenti a passare attraverso un ridicolo numero di re-render per cercare di ottenere i numeri di scala nel nome del controllo fa l'opposto. – Elliot

+0

@strpeter ha fornito una soluzione automatica nella sua risposta che ha funzionato perfettamente per me. –

1

Modifica: @gcalmettes pubblicati a better answer.
La sua soluzione dovrebbe probabilmente essere utilizzata al posto del metodo mostrato di seguito.
Tuttavia, lascerò questo perché a volte aiuta a vedere diversi modi di fare le cose.


Come mostrato nella the legend plotting guide, è possibile liberare spazio per un'altra sottotrama e posizionare la leggenda lì.

import matplotlib.pyplot as plt 
ax = plt.subplot(121) # <- with 2 we tell mpl to make room for an extra subplot 
ax.plot([1,2,3], color='red', label='thin red line') 
ax.plot([1.5,2.5,3.5], color='blue', label='thin blue line') 
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) 
plt.show() 

produce:

enter image description here

5

Qui è un altro modo di fare spazio (restringimento un asse):

# Shink current axis by 20% 
box = ax.get_position() 
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height]) 

dove 0,8 bilance la larghezza dell'asse del 20%. Sulla mia macchina win7 64, usando un fattore maggiore di 1, farò spazio alla legenda se è al di fuori della trama.

Questo codice è stato fatto riferimento da: How to put the legend out of the plot

15

Eventhough che è tardi, voglio fare riferimento a una bella alternativa, se siete interessati nel file di output di plt.savefig: in questo caso la bandiera bbox_inches='tight' è tuo amico!

import matplotlib.pyplot as plt 

fig = plt.figure(1) 
plt.plot([1, 2, 3], [1, 0, 1], label='A') 
plt.plot([1, 2, 3], [1, 2, 2], label='B') 
plt.legend(loc='center left', bbox_to_anchor=(1, 0)) 

fig.savefig('samplefigure', bbox_inches='tight') 

Output file: samplefigure.png

voglio fare riferimento anche ad una risposta più dettagliata: Moving matplotlib legend outside of the axis makes it cutoff by the figure box

Vantaggi

  • Non v'è alcuna necessità di registrare i dati/immagine reale.
  • È compatibile anche con lo plt.subplots dove gli altri non lo sono!
+1

funziona per me. Grazie! – weefwefwqg3

+0

Grazie! Questo ha funzionato molto bene con piccole modifiche necessarie. –

+0

@CarlodelMundo: Quali modifiche sono state necessarie nel tuo caso? Grazie per averlo condiviso con noi. – strpeter

Problemi correlati