Tamaño exacto de la figura en matplotlib con título, tags de eje

Preguntas similares se han hecho antes, pero todos los resultados de mi búsqueda no abordan mi problema. Toma el siguiente código de ejemplo:

from matplotlib.pyplot import * fig = figure(1, figsize=(3.25, 3)) plot([0,1,5,2,9]) title('title') xlabel('xAxis') ylabel('yAxis') fig.savefig('test.png',dpi=600) 

La cifra resultante es de 2040×1890 píxeles, o 3.4 “x3.15”, y la etiqueta x está cortada. Al mirar el archivo PNG en un editor de imágenes, parece que los ejes y las tags de tilde se ajustan al tamaño deseado. He intentado tomar la diferencia del tamaño de salida y el tamaño solicitado y volver a ingresarlo (3.25 – (3.4-3.25) = 3.10, pero matplotlib parece agregar un búfer arbitrario y aún no alcanza el tamaño deseado) ¿Cómo se hace una figura general que sea del tamaño deseado?

De acuerdo con el comentario de David Robinson, la cifra producida aquí es de 3.25 por 3 pulgadas, según lo medido por photoshop, aunque la etiqueta xlabel muestra un corte (mpl 1.1.0 en python 2.6 64-bit, win7)

Una solución para superar el problema es ajustar manualmente los márgenes con subplot_adjust :

 from matplotlib.pyplot import * fig = figure(1, figsize=(3.25, 3)) plot([0, 1, 5, 2, 9]) title('title') xlabel('xAxis') ylabel('yAxis') subplots_adjust(bottom=0.14) # <-- fig.savefig('test.png', dpi=600) 

El valor predeterminado de estos márgenes se establece en el archivo matploblibrc y puede modificarlo de forma permanente. El valor predeterminado para el margen inferior en mi caso fue 0,10.

Si su figura es de un tamaño incorrecto o correcta, como en mi caso, puede usar subplot_adjust para proporcionar suficiente espacio para la etiqueta. Luego, si es necesario, puede calcular la corrección para obtener la imagen real o el tamaño de figura que desea, como ya hizo.

La vista final de la figura guardada depende del tamaño de esa figura. Si show() su figura y la guarda desde el marco de vista de matplotlib, obtiene el corte de etiqueta en la imagen. Pero si aumenta manualmente el tamaño de la imagen, verá que aparece la etiqueta y si la guarda, también aparecerá en la imagen guardada. Digamos que es WYSIWYG. Su figura es de un tamaño muy pequeño y esto hace que su etiqueta se corte. Por lo tanto, otro enfoque es hacer una figura más grande, tal vez con menos ppp, para mantener el tamaño general. Esto también funciona:

 from matplotlib.pyplot import * fig = figure(1, figsize=(6.5, 6)) # <--- plot([0, 1, 5, 2, 9]) title('title') xlabel('xAxis') ylabel('yAxis') fig.savefig('test.png', dpi=300) # <--- 

En cualquier caso, consideraría esto como un error matplolib, ya que podría esperar tener una figura sin cortar después de trazar y guardar.

matplotlib 1.1.1 ha agregado figure.tight_layout() ( doc ) que lo hará por usted.