Cómo eliminar ejes, leyendas y relleno blanco
Me gustaría aplicar un mapa de colores a una imagen y escribir la imagen resultante, sin utilizar ejes, etiquetas, títulos ni nada que matplotlib agregue automáticamente. Aquí esta lo que hice:
def make_image(inputname,outputname):
data = mpimg.imread(inputname)[:,:,0]
fig = plt.imshow(data)
fig.set_cmap('hot')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig(outputname)
Elimina con éxito el eje de la figura, pero la figura guardada presenta un relleno blanco y un marco alrededor de la imagen real.
¿Cómo puedo quitarlos (al menos el acolchado blanco)?
El axis('off')
método resuelve uno de los problemas de manera más sucinta que cambiando por separado cada eje y borde. Sin embargo, todavía deja el espacio en blanco alrededor del borde. Agregar algo bbox_inches='tight'
al savefig
comando casi te lleva allí; Puedes ver en el siguiente ejemplo que el espacio en blanco que queda es mucho más pequeño, pero aún está presente.
Es posible que las versiones más nuevas de matplotlib requieran bbox_inches=0
en lugar de la cadena 'tight'
(a través de @episodeyang y @kadrach)
from numpy import random
import matplotlib.pyplot as plt
data = random.random((5,5))
img = plt.imshow(data, interpolation='nearest')
img.set_cmap('hot')
plt.axis('off')
plt.savefig("test.png", bbox_inches='tight')
Aprendí este truco de matehat, aquí :
import matplotlib.pyplot as plt
import numpy as np
def make_image(data, outputname, size=(1, 1), dpi=80):
fig = plt.figure()
fig.set_size_inches(size)
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
plt.set_cmap('hot')
ax.imshow(data, aspect='equal')
plt.savefig(outputname, dpi=dpi)
# data = mpimg.imread(inputname)[:,:,0]
data = np.arange(1,10).reshape((3, 3))
make_image(data, '/tmp/out.png')
rendimientos
Posible solución más simple:
Simplemente combiné el método descrito en la pregunta y el método de la respuesta de Hooked.
fig = plt.imshow(my_data)
plt.axis('off')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig('pict.png', bbox_inches='tight', pad_inches = 0)
Después de este código no hay espacios en blanco ni marco.
Nadie lo mencionó imsave
todavía, lo que hace que esto sea una sola línea:
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(10000).reshape((100, 100))
plt.imsave("/tmp/foo.png", data, format="png", cmap="hot")
Almacena directamente la imagen tal como está, es decir, no agrega ningún eje ni borde/relleno.
plt.axis('off')
plt.savefig('example.png',bbox_inches='tight',pad_inches = 0)
me da la imagen sin bordes.