Necesito tomar una imagen y guardarla después de algún proceso. La figura se ve bien cuando la muestro, pero después de guardar la figura, obtuve un espacio en blanco alrededor de la imagen guardada. He probado la 'tight'
opción de savefig
método, tampoco funcionó. El código:
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
fig = plt.figure(1)
img = mpimg.imread(path)
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches=extent)
plt.axis('off')
plt.show()
Estoy tratando de dibujar un gráfico básico usando NetworkX en una figura y guardarlo. Me di cuenta de que sin gráfico funciona, pero cuando agrego un gráfico obtengo un espacio en blanco alrededor de la imagen guardada;
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx
G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1,3)
G.add_edge(1,2)
pos = {1:[100,120], 2:[200,300], 3:[50,75]}
fig = plt.figure(1)
img = mpimg.imread("C:\\images\\1.jpg")
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
nx.draw(G, pos=pos)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches = extent)
plt.axis('off')
plt.show()
python
matplotlib
Ahmet Tuğrul Bayrak
fuente
fuente
Respuestas:
No puedo afirmar que sé exactamente por qué o cómo funciona mi "solución", pero esto es lo que tenía que hacer cuando quería trazar el contorno de un par de secciones de perfil aerodinámico, sin márgenes blancos, en un archivo PDF. (Tenga en cuenta que usé matplotlib dentro de un cuaderno de IPython, con la bandera -pylab).
He tratado de desactivar diferentes partes de esto, pero esto siempre conduce a un margen blanco en alguna parte. Incluso puede haber modificado esto para evitar que las líneas gruesas cerca de los límites de la figura se afeiten por la falta de márgenes.
fuente
set_major_locator
eran necesarias.pad_inches=0
que otras respuestas no mencionan.set_major_locator
Fue clave para mí.pad_inches
me ayudó.Se puede quitar el relleno de espacios en blanco mediante el establecimiento
bbox_inches="tight"
desavefig
:Tendrá que poner el argumento
bbox_inches
como una cadena, tal vez es por eso que no funcionó antes para usted.Posibles duplicados:
Gráficos de Matplotlib: eliminación de ejes, leyendas y espacios en blanco
¿Cómo establecer los márgenes para una figura matplotlib?
Reduzca los márgenes izquierdo y derecho en el diagrama matplotlib
fuente
fig.savefig()
. (plt.savefig()
no funcionará en ese caso.)bbox_inches
opción, hay otro valor predeterminado que deja algo de espacio. Si realmente quieres deshacerte de todo, también debes usarlopad_inches=0.0
. Por supuesto, un relleno tan apretado con frecuencia se corta, por ejemplo, exponentes ...pad_inches=-0.1
Después de probar las respuestas anteriores sin éxito (y un montón de otras publicaciones de pila), lo que finalmente funcionó para mí fue simplemente
Es importante destacar que esto no incluye los argumentos de bbox o relleno.
fuente
set_axis_off
. No afecta a la imagen guardada ya que después de quesubplots_adjust
el eje se encuentra fuera de la extensión de la figura y, de todos modos, no se trazará. Sin embargo, en los portátiles Jupyter, debe deshabilitar explícitamente el eje, ya que el backend en línea sobrescribe esta configuración.Encontré algo de Arvind Pereira ( http://robotics.usc.edu/~ampereir/wordpress/?p=626 ) y parecía funcionar para mí:
fuente
transparent=True
hará que parezca que no hay problema, pero solo ocultará el espacio en blanco, las dimensiones de la imagen no estarán bien.pad_inches
! ¡Ojalá hubiera sabido de esta opción antes!pad_inches=.25
La siguiente función incorpora la respuesta de johannes anterior. Lo he probado con
plt.figure
yplt.subplots()
con múltiples ejes, y funciona muy bien.fuente
Encontré que los siguientes códigos funcionan perfectamente para el trabajo.
fuente
Seguí esta secuencia y funcionó a las mil maravillas.
fuente
Para cualquiera que quiera trabajar en píxeles en lugar de pulgadas, esto funcionará.
Además de lo habitual, también necesitarás
Entonces puedes usar lo siguiente:
fuente
fig.dpi
lugarUn enfoque mucho más simple que he encontrado es de uso
plt.imsave
:fuente
plt.savefig()
.Puedes probar esto. Resolvió mi problema.
fuente
Si desea mostrar lo que se va a guardar, le recomiendo usar la
plt.tight_layout
transformación, que en realidad es más preferible, ya que no hace recortes innecesarios cuando se usaplt.savefig
fuente
Esto funciona para mí guardando una matriz numpy trazada con imshow para archivar
fuente