Графики 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)

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

4b9b3361

Я думаю, что команда 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

165
ответ дан 15 февр. '12 в 17:46
источник

Я узнал этот трюк из 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

58
ответ дан 15 февр. '12 в 17:40
источник

Возможное простейшее решение:

Я просто объединил метод, описанный в вопросе и метод из ответа 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)

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

No whitespaces, axes or frame

23
ответ дан 28 окт. '14 в 17:15
источник

Вы также можете указать степень фигуры в аргументе bbox_inches. Это избавится от белого заполнения вокруг фигуры.

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)
7
ответ дан 29 авг. '14 в 17:08
источник

Никто еще не упомянул 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")

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

введите описание изображения здесь

5
ответ дан 20 июля '17 в 15:24
источник