Soy nuevo en Python y Matplotlib, me gustaría simplemente aplicar un mapa de colores a una imagen y escribir la imagen resultante, sin usar ejes, etiquetas, títulos o cualquier cosa 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 eliminarlos (al menos el relleno blanco)? Gracias
python
matplotlib
sunmat
fuente
fuente
imshow
. Si tiene un diagrama de dispersión, la siguiente respuesta podría ayudarlo: stackoverflow.com/a/40727744/4124317Respuestas:
Creo que el comando
axis('off')
se ocupa de uno de los problemas de manera más sucinta que cambiar cada eje y el borde por separado. Sin embargo, todavía deja el espacio en blanco alrededor de la frontera. Agregarbbox_inches='tight'
alsavefig
comando casi lo lleva allí, puede ver en el siguiente ejemplo que el espacio en blanco que queda es mucho más pequeño, pero aún está presente.Tenga en cuenta que las versiones más recientes de matplotlib pueden requerir en
bbox_inches=0
lugar de la cadena'tight'
(a través de @episodeyang y @kadrach)fuente
fig = plt.figure()
,ax = plt.axes([0,0,1,1])
y, a continuaciónplt.imshow(data,interpolation="nearest"
. Combinado conplt.axis("off")
, debería deshacerse de todo junto a la imagen en sí, ¡con suerte!bbox_inches=0
hizo el truco.Aprendí este truco de matehat, aquí :
rendimientos
fuente
plt.Axes(fig, [0,0,1,1])
. Esto le dice a matplotlib que cree un conjunto de ejes con la esquina inferior izquierda en el punto ubicado en (0%, 0%), y con un ancho y una altura de (100%, 100%).Posible solución más simple:
Simplemente combiné el método descrito en la pregunta y el método de la respuesta de Hooked.
Después de este código no hay espacios en blanco ni marco.
fuente
fig.axes.get_xaxis().set_visible(False)
resuelve el problema. Graciasfig.axes[0]
y, en general, todos o ejes seleccionados.Nadie lo mencionó
imsave
aún, lo que lo convierte en una frase:Almacena directamente la imagen tal como está, es decir, no agrega ningún eje o borde / relleno.
fuente
También puede especificar la extensión de la figura al
bbox_inches
argumento. Esto eliminaría el relleno blanco alrededor de la figura.fuente
Esto debería eliminar todo el relleno y los bordes:
fuente
ax
) conextent = plt.gca().get_window_extent().transformed(fig.dpi_scale_trans.inverted())
.Descubrí que todo está documentado ...
https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.axis.html#matplotlib.axes.Axes.axis
Mi código…. "bcK" es una imagen de 512x512
fuente
La respuesta votada ya no funciona. Para que funcione, debe agregar manualmente un conjunto de ejes a [0, 0, 1, 1] o eliminar el parche de la figura.
Alternativamente, puede eliminar el parche. No es necesario agregar una subtrama para eliminar los rellenos. Esto se simplifica a partir de la respuesta de Vlady a continuación.
Esto se prueba con la versión
3.0.3
el 19/06/2019. Imagen a continuación:Una cosa mucho más simple de hacer es usar
pyplot.imsave
. Para más detalles, vea la respuesta de Luator a continuación.fuente
Me gustó la respuesta de ubuntu , pero no mostraba explícitamente cómo configurar el tamaño de las imágenes no cuadradas de forma inmediata, así que lo modifiqué para copiar y pegar fácilmente:
Guardar imágenes sin borde es fácil sea cual sea el dpi que elija si se mantiene pixel_size / dpi = size.
Sin embargo, la visualización es espeluznante. Si elige ppp pequeños, el tamaño de su imagen puede ser mayor que su pantalla y obtendrá un borde durante la visualización. Sin embargo, esto no afecta el ahorro.
Entonces para
La pantalla se vuelve confinada (pero guarda trabajos):
fuente
Primero, para ciertos formatos de imagen (es decir, TIFF ), puede guardar el mapa de colores en el encabezado y la mayoría de los espectadores mostrarán sus datos con el mapa de colores.
Para guardar una
matplotlib
imagen real , que puede ser útil para agregar anotaciones u otros datos a las imágenes, he usado la siguiente solución:fuente
Gracias por las asombrosas respuestas de todos ... Tuve exactamente el mismo problema con querer trazar solo una imagen sin relleno / espacio adicional, etc., así que estaba muy feliz de encontrar las ideas de todos aquí.
Además de la imagen sin relleno, también quería poder agregar fácilmente anotaciones, etc., más allá de un simple diagrama de imagen.
Entonces, lo que terminé haciendo fue combinar la respuesta de David con csnemes para hacer una envoltura simple en el momento de la creación de la figura. Cuando usas eso, no necesitas ningún cambio posterior con imsave () o cualquier otra cosa:
fuente