tutorial instalar examples español python matplotlib

instalar - plot() python



Gráficos de Matplotlib: eliminación de ejes, leyendas y espacios en blanco (7)

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

Soy nuevo en Python y Matplotlib, me gustaría simplemente aplicar colormap a una imagen y escribir la imagen resultante, sin usar ejes, etiquetas, títulos ni nada que sea agregado automáticamente por matplotlib. 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)

Se 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


Creo que el axis(''off'') comando axis(''off'') se encarga de uno de los problemas de manera más sucinta que cambiar cada eje y el borde por separado. Sin embargo, deja el espacio en blanco alrededor de la frontera. Agregar bbox_inches=''tight'' al comando savefig casi lo lleva hasta allí, puede ver en el ejemplo a continuación que el espacio en blanco que queda es mucho más pequeño, pero aún está presente.

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


En primer lugar, 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 imagen matplotlib real, que puede ser útil para agregar anotaciones u otros datos a las imágenes, he utilizado la siguiente solución:

fig, ax = plt.subplots(figsize=inches) ax.matshow(data) # or you can use also imshow # add annotations or anything else # The code below essentially moves your plot so that the upper # left hand corner coincides with the upper left hand corner # of the artist fig.subplots_adjust(left=0, right=1, top=1, bottom=0, wspace=0, hspace=0) # now generate a Bbox instance that is the same size as your # single axis size (this bbox will only encompass your figure) bbox = matplotlib.transforms.Bbox(((0, 0), inches)) # now you can save only the part of the figure with data fig.savefig(savename, bbox_inches=bbox, **kwargs)


Me gustó respuesta , pero no mostraba explícitamente cómo configurar el tamaño para imágenes no cuadradas listas para usar, así que lo modifiqué para copiar y pegar fácilmente:

import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np def save_image_fix_dpi(data, dpi=100): shape=np.shape(data)[0:2][::-1] size = [float(i)/dpi for i in shape] fig = plt.figure() fig.set_size_inches(size) ax = plt.Axes(fig,[0,0,1,1]) ax.set_axis_off() fig.add_axes(ax) ax.imshow(data) fig.savefig(''out.png'', dpi=dpi) plt.show()

Guardar imágenes sin borde es fácil cualquiera que sea el dpi que elija si se mantiene pixel_size / dpi = size.

data = mpimg.imread(''test.png'') save_image_fix_dpi(data, dpi=100)

Sin embargo, mostrar es espeluznante. Si elige una resolución de dpi pequeña, el tamaño de su imagen puede ser más grande que la de su pantalla y obtendrá un borde durante la visualización. Sin embargo, esto no afecta el ahorro.

Entonces para

save_image_fix_dpi(data, dpi=20)

La pantalla se bordea (pero guardar funciona):


Nadie mencionó imsave aún, lo que hace que esto sea único:

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 o borde / relleno.


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.


También puede especificar la extensión de la figura al argumento bbox_inches . Esto eliminaría el relleno blanco alrededor de la figura.

def make_image(inputname,outputname): data = mpimg.imread(inputname)[:,:,0] fig = plt.imshow(data) fig.set_cmap(''hot'') ax = fig.gca() ax.set_axis_off() ax.autoscale(False) extent = ax.get_window_extent().transformed(plt.gcf().dpi_scale_trans.inverted()) plt.savefig(outputname, bbox_inches=extent)