Графики Matplotlib: удаление оси, легенд и пробелов



Я новичок в Python и Matplotlib, я хотел бы просто применить colormap к изображению и написать результирующее изображение, не используя оси, метки, заголовки или что-либо обычно автоматически добавляемое matplotlib. Вот что я сделал:



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)


он успешно удаляет ось фигуры, но сохраненная фигура представляет собой белое заполнение и рамку вокруг фактического изображения.
Как я могу удалить их (по крайней мере белая обивка)? Спасибо

729   8  

8 ответов:

Я думаю, что команда axis('off') решает одну из проблем более лаконично, чем изменение каждой оси и границы отдельно. Однако он по-прежнему оставляет белое пространство вокруг границы. Добавление bbox_inches='tight' до savefig команда почти получает вас там, вы можете видеть в примере ниже, что пустое пространство слева намного меньше, но все еще присутствует.

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

enter image description here

Я научился этому трюку от matehat, здесь:

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

доходность

enter image description here

возможно самое простое решение:

Я просто объединил метод, описанный в вопросе, и метод из ответа на крючок.

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)

после этого кода нет пробелов и без рамки.

No whitespaces, axes or frame

никто не упомянул imsave тем не менее, что делает это однострочным:

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

он непосредственно сохраняет изображение как оно есть, т. е. не добавляет никаких осей или границ/отступов.

enter image description here

вы также можете указать степень рисунке

Это должно удалить все отступы и границы:

from matplotlib import pyplot as plt

fig = plt.figure()
fig.patch.set_visible(False)

ax = fig.add_subplot(111)

plt.axis('off')
plt.imshow(data)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig("../images/test.png", bbox_inches=extent)

во-первых, для некоторых форматов изображения (т. е. TIFF) вы можете сохранить цветовую карту в заголовке, и большинство зрителей будут показывать ваши данные с цветовой картой.

для сохранения фактической matplotlib изображение, которое может быть полезно для добавления аннотаций или других данных к изображениям, я использовал следующее решение:

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)

мне понравилось ubuntu ответ, но он явно не показывал, как установить размер для неквадратных изображений из коробки, поэтому я изменил его для легкого копирования:

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

сохранение изображений без границы легко любой dpi вы выбираете, если pixel_size/dpi=размер сохраняется.

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

enter image description here

однако отображение является жутким. Если вы выберете малый dpi, ваш размер изображения может быть больше, чем ваш экран, и вы получите границу во время показа. Тем не менее, это не влияет на спасение.

Так

save_image_fix_dpi(data, dpi=20)

дисплей становится граничным (но сохранение работает): enter image description here

Comments

    Ничего не найдено.