savefig - python graficos 2d
scipy: savefig sin marcos, ejes, solo contenido (8)
En numpy / scipy tengo una imagen almacenada en una matriz. Puedo mostrarlo, quiero guardarlo usando savefig
sin fronteras, ejes, etiquetas, títulos ... Solo imagen pura, nada más.
Quiero evitar paquetes como PyPNG
o scipy.misc.imsave
, a veces son problemáticos (no siempre se instalan bien, solo savefig()
básico para mí)
Asumiendo :
import matplotlib.pyplot as plt
Para hacer una figura sin el marco:
fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)
Para que el contenido llene toda la figura
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
Luego dibuja tu imagen en él:
ax.imshow(your_image, aspect=''normal'')
fig.savefig(fname, dpi)
El parámetro aspect
cambia el tamaño del píxel para asegurarse de que llenan el tamaño de figura especificado en fig.set_size_inches(…)
. Para tener una idea de cómo jugar con este tipo de cosas, lea la documentación de matplotlib , especialmente sobre el tema de ejes, eje y artista.
Este trabajo para mí
plt.savefig(''filename'',bbox_inches=''tight'',transparent=True, pad_inches=0)
He intentado varias opciones en mi caso, y la mejor solución fue esta:
fig.subplots_adjust(bottom = 0)
fig.subplots_adjust(top = 1)
fig.subplots_adjust(right = 1)
fig.subplots_adjust(left = 0)
luego guarda tu figura con savefig
Puede encontrar la bbox de la imagen dentro del eje (usando get_window_extent
) y usar el parámetro bbox_inches
para guardar solo esa parte de la imagen:
import numpy as np
import matplotlib.pyplot as plt
data=np.arange(9).reshape((3,3))
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
plt.axis(''off'')
plt.imshow(data)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig(''/tmp/test.png'', bbox_inches=extent)
Aprendí este truco de Joe Kington here .
Si bien las respuestas anteriores abordan la eliminación de los márgenes y el relleno, no funcionaron para mí en la eliminación de etiquetas. Esto es lo que funcionó, para cualquiera que tropiece con esta pregunta más tarde:
Suponiendo que quiere una grilla de subtramas de 2x2 a partir de cuatro imágenes almacenadas en images
:
matplotlib.pyplot.figure(figsize = (16,12)) # or whatever image size you require
for i in range(4):
ax = matplotlib.pyplot.subplot(2,2,i+1)
ax.axis(''off'')
imshow(images[i])
matplotlib.pyplot.savefig(path, bbox_inches=''tight'')
Sugeriré la respuesta de heron13 con una pequeña adición tomada de here para eliminar el relleno que queda después de configurar la bbox en modo apretado, por lo tanto:
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
fig.savefig(''out.png'', bbox_inches=''tight'', pad_inches=0)
Tuve el mismo problema al hacer una visualización usando librosa donde quería extraer el contenido de la trama sin ninguna otra información. Así que este es mi enfoque. La respuesta unutbu también me ayuda a trabajar.
figure = plt.figure(figsize=(500, 600), dpi=1)
axis = plt.subplot(1, 1, 1)
plt.axis(''off'')
plt.tick_params(axis=''both'', left=''off'', top=''off'', right=''off'', bottom=''off'', labelleft=''off'', labeltop=''off'',
labelright=''off'', labelbottom=''off'')
# your code goes here. e.g: I used librosa function to draw a image
result = np.array(clip.feature_list[''fft''].get_logamplitude()[0:2])
librosa.display.specshow(result, sr=api.Clip.RATE, x_axis=''time'', y_axis=''mel'', cmap=''RdBu_r'')
extent = axis.get_window_extent().transformed(figure.dpi_scale_trans.inverted())
plt.savefig((clip.filename + str("_.jpg")), format=''jpg'', bbox_inches=extent, pad_inches=0)
plt.close()
Una solución más fácil parece ser:
fig.savefig(''out.png'', bbox_inches=''tight'', pad_inches=0)