2012-03-10 10 views
24

Estoy intentando crear una gráfica con una leyenda a un lado usando matplotlib. Puedo ver que la trama se está creando, pero los límites de la imagen no permiten que se muestre toda la leyenda.Se está cortando mi leyenda matplotlib.pyplot

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.) 

Esto produce: enter image description here

+0

[Esta respuesta] (https://stackoverflow.com/a/43439132/4124317) proporciona una descripción general de varias técnicas que se pueden utilizar para que la leyenda aparezca dentro de los límites de las figuras. – ImportanceOfBeingErnest

Respuesta

16

Como se señaló por Adam, que necesita para hacer espacio en el lado de la gráfica. Si desea ajustar con precisión el espacio necesario, es posible que desee consultar el método add_axes de matplotlib.pyplot.artist.

continuación es un ejemplo rápido:

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() 

y la imagen resultante: image

+50

Sé que a matplotlib le gusta sugerir que todo está bajo el control del usuario, pero todo esto con las leyendas es demasiado bueno. Si coloco la leyenda afuera, _obviously_ quiero que siga siendo visible. La ventana solo debe escalarse para ajustarse en lugar de crear esta enorme molestia de reajuste. Como mínimo, debe haber una opción True predeterminada para controlar este comportamiento de autoescalado. Obligar a los usuarios a pasar por un número ridículo de repeticiones para tratar de obtener los números de la escala en nombre del control logra lo contrario. – Elliot

+0

@strpeter ha proporcionado una solución automática en su respuesta que funcionó perfectamente bien para mí. –

1

Editar: @gcalmettes publican a better answer.
Su solución probablemente debería usarse en lugar del método que se muestra a continuación.
Sin embargo, lo dejo, ya que a veces ayuda a ver diferentes maneras de hacer las cosas.


Como se muestra en the legend plotting guide, puede dar lugar a otra subtrama y colocar la leyenda allí.

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

aquí es otra manera de hacer espacio (reducción de un eje):

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

donde 0,8 escalas el ancho del eje en un 20%. En mi máquina win7 64, usar un factor mayor que 1 hará espacio para la leyenda si está fuera de la trama.

Este código se hace referencia a partir de: How to put the legend out of the plot

15

Apesar de que es tarde, me quiero referir a una buena alternativa si usted está interesado en el archivo de salida de plt.savefig: en este caso la bandera bbox_inches='tight' es su amigo!

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

quiero hacer referencia también a una respuesta más detallada: Moving matplotlib legend outside of the axis makes it cutoff by the figure box

Ventajas

  • No hay necesidad de ajustar los datos/imagen real.
  • Es compatible con plt.subplots como ... bueno, como los otros no!
+1

funciona para mí. ¡Gracias! – weefwefwqg3

+0

¡Gracias! Esto funcionó muy bien con pocas modificaciones necesarias. –

+0

@CarlodelMundo: ¿Qué modificaciones fueron necesarias en su caso? Gracias por compartir con nosotros. – strpeter

Cuestiones relacionadas