Удаление пробела вокруг сохраненного изображения в matplotlib
Мне нужно взять изображение и сохранить его после некоторого процесса. Фигура выглядит хорошо, когда я ее отображаю, но после сохранения фигуры у меня появилось свободное пространство вокруг сохраненного изображения. Я попробовал 'tight'
вариант для метода savefig
, тоже не сработало. Код:
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
fig = plt.figure(1)
img = mpimg.imread(path)
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches=extent)
plt.axis('off')
plt.show()
Я пытаюсь нарисовать базовый график с помощью NetworkX на рисунке и сохранить его. Я понял, что без графика это работает, но при добавлении графика я получаю пробел вокруг сохраненного изображения;
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx
G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1,3)
G.add_edge(1,2)
pos = {1:[100,120], 2:[200,300], 3:[50,75]}
fig = plt.figure(1)
img = mpimg.imread("C:\\images\\1.jpg")
plt.imshow(img)
ax=fig.add_subplot(1,1,1)
nx.draw(G, pos=pos)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches = extent)
plt.axis('off')
plt.show()
Ответы
Ответ 1
Я не могу утверждать, что я точно знаю, почему и как работает мое "решение", но это то, что я должен был сделать, когда захотел составить схему нескольких секций аэрофотоснимков; без белых полей; в файл PDF.
(Обратите внимание, что я использовал matplotlib внутри ноутбука IPython с флагом -pylab.)
gca().set_axis_off()
subplots_adjust(top = 1, bottom = 0, right = 1, left = 0,
hspace = 0, wspace = 0)
margins(0,0)
gca().xaxis.set_major_locator(NullLocator())
gca().yaxis.set_major_locator(NullLocator())
savefig("filename.pdf", bbox_inches = 'tight',
pad_inches = 0)
Я попытался деактивировать разные части этого, но это всегда приводит к получению белого поля. Возможно, вы даже модифицируете это, чтобы поддерживать живые линии вблизи пределов фигуры от побритости из-за отсутствия полей.
Ответ 2
Вы можете удалить пробел пробела, установив bbox_inches="tight"
в savefig
:
plt.savefig("test.png",bbox_inches='tight')
Вам нужно поместить аргумент в bbox_inches
в виде строки, возможно, именно поэтому он не работал раньше для вас.
Возможные дубликаты:
Графы Matplotlib: удаление оси, легенд и пробелов
Как установить поля для фигуры matplotlib?
Уменьшить левое и правое поля в графике matplotlib
Ответ 3
Я нашел что-то от Арвинда Перейры (http://robotics.usc.edu/~ampereir/wordpress/?p=626) и, похоже, работал на меня:
plt.savefig(filename, transparent = True, bbox_inches = 'tight', pad_inches = 0)
Ответ 4
Следующая функция включает в себя ответ Йоханнеса выше. Я проверил это с помощью plt.figure
и plt.subplots()
с несколькими осями, и это прекрасно работает.
def save(filepath, fig=None):
'''Save the current image with no whitespace
Example filepath: "myfig.png" or r"C:\myfig.pdf"
'''
import matplotlib.pyplot as plt
if not fig:
fig = plt.gcf()
plt.subplots_adjust(0,0,1,1,0,0)
for ax in fig.axes:
ax.axis('off')
ax.margins(0,0)
ax.xaxis.set_major_locator(plt.NullLocator())
ax.yaxis.set_major_locator(plt.NullLocator())
fig.savefig(filepath, pad_inches = 0, bbox_inches='tight')
Ответ 5
Я обнаружил, что следующие коды отлично работают для этой работы.
fig = plt.figure(figsize=[6,6])
ax = fig.add_subplot(111)
ax.imshow(data)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.set_frame_on(False)
plt.savefig('data.png', dpi=400, bbox_inches='tight',pad_inches=0)
Ответ 6
После безуспешных попыток получить ответы на эти вопросы (и множество других сообщений в стеке) у меня наконец получилось
plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0,
hspace = 0, wspace = 0)
plt.margins(0,0)
plt.savefig("myfig.pdf")
Важно, что это не включает аргументы bbox или padding. По непонятным причинам, когда в моем файле сохранения был включен аргумент bbox, моя фигура была смещена вправо и вверх от центра.
Ответ 7
Я следовал этой последовательности, и она работала как очарование.
plt.axis("off")
fig=plt.imshow(image array,interpolation='nearest')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig('destination_path.pdf',
bbox_inches='tight', pad_inches=0, format='pdf', dpi=1200)
Ответ 8
Я нашел гораздо более простой подход - использовать plt.imsave
:
import matplotlib.pyplot as plt
arr = plt.imread(path)
plt.imsave('test.png', arr)
Ответ 9
Для всех, кто хочет работать в пикселях, а не в дюймах, это подойдет.
Плюс к обычному вам также понадобится
from matplotlib.transforms import Bbox
Тогда вы можете использовать следующее:
my_dpi = 100 # Good default - does not really matter
# Size of output in pixels
h = 224
w = 224
fig, ax = plt.subplots(1, figsize=(w/my_dpi, h/my_dpi), dpi=my_dpi)
ax.set_position([0, 0, 1, 1]) # Critical!
# Do some stuff
ax.imshow(img)
ax.imshow(heatmap) # 4-channel RGBA
ax.plot([50, 100, 150], [50, 100, 150], color="red")
ax.axis("off")
fig.savefig("saved_img.png",
bbox_inches=Bbox([[0, 0], [w/my_dpi, h/my_dpi]]),
dpi=my_dpi)
![enter image description here]()
Ответ 10
Если вы хотите отобразить то, что должно быть сохранено, я рекомендую использовать преобразование plt.tight_layout
, которое на самом деле является более предпочтительным, поскольку при использовании plt.savefig
не выполняется ненужное кадрирование.
import matplotlib as plt
plt.plot([1,2,3], [1,2,3])
plt.tight_layout(pad=0)
plt.savefig('plot.png')
К сожалению, это решение все еще оставляет небольшое поле справа и сверху.
Ответ 11
Это работает для меня, сохраняя массив numpy, построенный с помощью imshow, в файл
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10,10))
plt.imshow(img) # your image here
plt.axis("off")
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0,
hspace = 0, wspace = 0)
plt.savefig("example2.png", box_inches='tight', dpi=100)
plt.show()