Графики 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)
он успешно удаляет ось фигуры, но сохраненная фигура представляет собой белое заполнение и рамку вокруг фактического изображения.
Как я могу удалить их (по крайней мере белая обивка)? Спасибо
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')
Я научился этому трюку от 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')доходность
возможно самое простое решение:
Я просто объединил метод, описанный в вопросе, и метод из ответа на крючок.
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)после этого кода нет пробелов и без рамки.
никто не упомянул
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")он непосредственно сохраняет изображение как оно есть, т. е. не добавляет никаких осей или границ/отступов.
Это должно удалить все отступы и границы:
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)однако отображение является жутким. Если вы выберете малый dpi, ваш размер изображения может быть больше, чем ваш экран, и вы получите границу во время показа. Тем не менее, это не влияет на спасение.
Так
save_image_fix_dpi(data, dpi=20)






Comments