Estoy familiarizado con las siguientes preguntas:Moving leyenda matplotlib fuera del eje hace que sea corte por la caja de la figura
Matplotlib savefig with a legend outside the plot
How to put the legend out of the plot
Parece que las respuestas de estas preguntas tienen la lujo de poder jugar con la contracción exacta del eje para que la leyenda se adapte.
La reducción de los ejes, sin embargo, no es una solución ideal porque reduce los datos y hace que sea más difícil de interpretar; particularmente cuando es complejo y hay muchas cosas sucediendo ... por lo tanto, necesita una gran leyenda
El ejemplo de una leyenda compleja en la documentación demuestra la necesidad de esto porque la leyenda en su trazado en realidad oscurece completamente múltiples puntos de datos .
http://matplotlib.sourceforge.net/users/legend_guide.html#legend-of-complex-plots
Lo que me gustaría ser capaz de hacer es dinámicamente ampliar el tamaño de la caja de la figura para dar cabida a la leyenda de la figura expansión.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.1)
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')
ax.plot(x, np.arctan(x), label='Inverse tan')
lgd = ax.legend(loc=9, bbox_to_anchor=(0.5,0))
ax.grid('on')
Observe cómo la etiqueta final 'Inverse bronceado' es en realidad fuera de la caja de la figura (y se ve mal corte - no calidad de publicación)
Por último, me han dicho que este es comportamiento normal en R y LaTeX, así que estoy un poco confundido por qué esto es tan difícil en Python ... ¿Hay alguna razón histórica? ¿Matlab es igualmente pobre en este asunto?
Tengo la versión (sólo un poco) más larga de este código en Pastebin http://pastebin.com/grVjc007
En cuanto a la razón por la es que es porque matplotlib se orienta hacia parcelas interactivos, mientras que R, etc, no lo son (Y sí, Matlab es "igualmente pobre" en este caso particular). Para hacerlo correctamente, debe preocuparse por cambiar el tamaño de los ejes cada vez que se cambia el tamaño de la figura, se amplía o se actualiza la posición de la leyenda. (Efectivamente, esto significa verificar cada vez que se traza la trama, lo que conduce a ralentizaciones.) Ggplot, etc., son estáticos, por eso tienden a hacer esto de forma predeterminada, mientras que matplotlib y matlab no. Dicho esto, 'tight_layout()' debe cambiarse para tener en cuenta las leyendas. –
También estoy discutiendo esta cuestión en la lista de correo de los usuarios de matplotlib. Así que tengo la sugerencia de ajustar la línea savefig a: fig.savefig ('samplefigure', bbox_extra_artists = (lgd,), bbox = 'tight') – jbbiomed
Sé que matplotlib le gusta tout que todo está bajo el control de la usuario, pero todo esto con las leyendas es demasiado bueno. Si pongo la leyenda afuera, obviamente quiero que aún esté 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