Estoy luchando para lidiar con mis márgenes de trama en matplotlib. He usado el siguiente código para producir mi gráfico:
plt.imshow(g)
c = plt.colorbar()
c.set_label("Number of Slabs")
plt.savefig("OutputToUse.png")
Sin embargo, obtengo una cifra de salida con mucho espacio en blanco a cada lado de la trama. Busqué en Google y leí la documentación de matplotlib, pero parece que no puedo encontrar cómo reducir esto.
python
matplotlib
robintw
fuente
fuente
extent
de laimshow
figura, o la cantidad de espacio en blanco en el borde png resultante, en torno a la figura, que generasavefig
?savefig
, así que eso es lo que me gustaría ordenar.Respuestas:
Una forma de hacer esto automáticamente es
bbox_inches='tight'
kwarg toplt.savefig
.P.ej
Otra forma es usar
fig.tight_layout()
fuente
fig.savefig()
. (plt.savefig()
no funcionará en ese caso.)fig.tight_layout()
. Esa función no existía cuando esta respuesta se escribió originalmente, de lo contrario la mencionaría de manera más prominente.fig = plt.gcf()
Puede ajustar el espacio alrededor de las figuras matplotlib utilizando la función subplots_adjust ():
Esto funcionará tanto para la figura en pantalla como para guardarla en un archivo, y es la función correcta para llamar incluso si no tiene múltiples trazados en la figura.
Los números son fracciones de las dimensiones de la figura y deberán ajustarse para permitir las etiquetas de la figura.
fuente
GridSpec
objetos llamando alupdate
método (consulte stackoverflow.com/a/20058199/1030876 ).Todo lo que necesitas es
antes de su salida.
Además de reducir los márgenes, esto también agrupa estrechamente el espacio entre las subtramas:
fuente
bbox_inches='tight'
, que solo recorta el espacio en blanco alrededor de los bordes, pero deja la trama sola. Creé la figura conplt.figure(figsize=(10,3))
.Solo úselo
ax = fig.add_axes([left, bottom, width, height])
si desea un control exacto del diseño de la figura. p.ej.fuente
En caso de que alguien se pregunte cómo deshacerse del resto del margen blanco después de aplicar
plt.tight_layout()
ofig.tight_layout()
: Con el parámetropad
(que es el1.08
predeterminado), puede hacerlo aún más apretado: "Relleno entre el borde de la figura y los bordes de subtramas, como una fracción del tamaño de fuente ". Así por ejemplolo reducirá a un margen muy pequeño. Poner
0
no funciona para mí, ya que también hace que la caja de la subtrama se corte un poco.fuente
fuente
savefig
función es elegante, sin embargo, el valor negativo parapad_inches
no es necesariamente necesario en todos los casos.El problema con matplotlibs subplots_adjust es que los valores que ingresas son relativos al tamaño x e y de la figura. Este ejemplo es para el correcto dimensionamiento para imprimir un pdf:
Para eso, recalculo el espacio relativo a valores absolutos como este:
para una figura de pulgadas 'figure.xsize' en dimensión xy pulgadas 'figure.ysize' en dimensión y. Por lo tanto, toda la figura tiene un margen izquierdo de 5 mm, margen inferior de 4 mm, derecho de 1 mm y superior de 3 mm dentro de las etiquetas. La conversión de (x / 25.4) se realizó porque necesitaba convertir mm a pulgadas.
Tenga en cuenta que el tamaño del gráfico puro de x será "figure.xsize - margen izquierdo - margen derecho" y el tamaño del gráfico puro de y será "figure.ysize - margen inferior - margen superior" en pulgadas
Otros fragmentos (no estoy seguro acerca de estos, solo quería proporcionar los otros parámetros)
y
fuente
xsize
yysize
de dónde . Uso esas propiedades y obtengoAttributeError: 'Figure' object has no attribute 'xsize'
inspirado por la respuesta de Sammys arriba:
Donde figsize es la tupla que usaste en
fig = pyplot.figure(figsize=...)
fuente
Para mí, las respuestas anteriores no funcionaron
matplotlib.__version__ = 1.4.3
en Win7. Entonces, si solo estamos interesados en la imagen en sí (es decir, si no necesitamos anotaciones, eje, marcas, título, etiqueta, etc.), entonces es mejor simplemente guardar la matriz numpy como imagen en lugar desavefig
.Además, utilizando las funciones de dibujo opencv (cv2.line, cv2.polylines), podemos hacer algunos dibujos directamente en la matriz numpy. http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html
fuente
Con versiones recientes de matplotlib, es posible que desee probar Diseño restringido .
fuente