Cómo eliminar ejes, leyendas y relleno blanco

Resuelto sunmat asked hace 12 años • 17 respuestas

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)?

sunmat avatar Feb 15 '12 21:02 sunmat
Aceptado

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 savefigcomando 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=0en 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')

ingrese la descripción de la imagen aquí

Hooked avatar Feb 15 '2012 14:02 Hooked

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

ingrese la descripción de la imagen aquí

unutbu avatar Feb 15 '2012 14:02 unutbu

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.

Sin espacios en blanco, ejes ni marcos.

Domagoj avatar Oct 28 '2014 14:10 Domagoj

Nadie lo mencionó imsavetodaví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.

ingrese la descripción de la imagen aquí

luator avatar Jul 20 '2017 12:07 luator
plt.axis('off')

plt.savefig('example.png',bbox_inches='tight',pad_inches = 0)

me da la imagen sin bordes.

Nazmus Sakib Akash avatar Dec 08 '2020 12:12 Nazmus Sakib Akash