matplotlib에서 저장된 이미지 주위의 공백 제거


172

이미지를 가져 와서 일부 프로세스 후에 저장해야합니다. 그림을 표시하면 그림이 잘 보이지만 그림을 저장 한 후 저장된 이미지 주위에 공백이 생겼습니다. 방법에 대한 '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()


실제로 나를 위해 일한 것은 pdfcrop과 같은 다른 도구를 사용하여 pdf를 자르는 것이 었습니다.
toliveira

답변:


169

“솔루션”이 왜 또는 어떻게 작동하는지 정확히 알 수는 없지만, 이것은 흰 여백이없는 몇 개의 에어로 포일 섹션의 개요를 PDF 파일로 플롯하려고 할 때해야 할 일입니다. (필자는 -pylab 플래그와 함께 IPython 노트북 내에서 matplotlib를 사용했습니다.)

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.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.savefig("filename.pdf", bbox_inches = 'tight',
    pad_inches = 0)

이 부분의 다른 부분을 비활성화하려고 시도했지만 항상 어딘가에 흰색 여백이 생깁니다. 여백이 부족하여 그림의 한계 근처에있는 굵은 선이 깎이지 않도록 이것을 수정했을 수도 있습니다.


6
마침내 작동하는 무언가, 정말 고마워요! 그건 그렇고, 내 경우에는 사용하는 두 줄만 set_major_locator필요했습니다.
Florian Brucker

6
지난 몇 시간 동안 다양한 일을 시도했지만 1px 흰색 테두리를 제거 할 수 없었습니다. 이것은 유일하게 작동 한 것입니다-특히 pad_inches=0다른 대답은 언급하지 않았습니다.
AnnanFay

1
set_major_locator나를위한 열쇠였습니다.
kmac

16
pad_inches나를 도와 주었다.
Myles Baker

5
matplotlib.ticker.NullLocator ()
Joop

200

다음 bbox_inches="tight"에서 설정 하여 공백 패딩을 제거 할 수 있습니다 savefig.

plt.savefig("test.png",bbox_inches='tight')

당신은 인수를 bbox_inches문자열로 넣어야 할 것입니다. 아마도 이것이 당신을 위해 일찍 작동하지 않았기 때문일 것입니다.


가능한 중복 :

Matplotlib 플롯 : 축, 범례 및 공백 제거

matplotlib 그림의 여백을 설정하는 방법은 무엇입니까?

matplotlib 플롯에서 왼쪽 및 오른쪽 여백 감소


1
여러 서브 플롯이 있고 각 서브 플롯을 저장하려는 경우이 서브 플롯 fig.savefig()도 함께 사용할 수 있습니다 . ( plt.savefig()이 경우 작동하지 않습니다.)
Abhranil Das

30
그건 아니에요 아주 좋아. 이 bbox_inches옵션 을 사용하면 약간의 공백이 남는 또 다른 기본값이 있습니다. 정말로 모든 것을 제거하려면을 사용해야 pad_inches=0.0합니다. 물론, 이러한 단단한 패딩은 지수와 같은 빈번한 컷오프를 자주 차단합니다.
Mike

5
검은 색 가장자리를 제거하려면 다음을 설정해야합니다.pad_inches=-0.1
lenhhoxung

10
이것은 단순히 작동하지 않으며 여전히 그림 주위에 공백이 생깁니다. 투명 옵션 (일부 답변에서 언급)을 설정해도 실제로 도움이되지 않으며 공백이 여전히 있습니다. 투명합니다.
BjornW

1
@ piperchester 그것은 좋은 질문이지만, 의견에서 잃어 버리지 않도록 새로운 질문으로 질문해야합니다. 새 질문을 이전 질문에 연결해야합니다!

21

성공하지 않고 위의 답변을 시도한 후 (그리고 다른 스택 게시물이 많았습니다) 마침내 나를 위해 일한 것은 단지

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 인수를 포함하지 않습니다.


4
이것이 정답입니다. 또한을 호출 할 필요도 없습니다 set_axis_off. 이 후부터 저장된 이미지에 영향을주지 않습니다 subplots_adjust축이 거짓말을 외부 그림의 정도와 henve 어쨌든 plotten되지 않습니다. 그러나 Jupyter 노트북에서는 인라인 백엔드가 이러한 설정을 덮어 쓰기 때문에 축을 명시 적으로 비활성화해야합니다.
MaxPowers

20

Arvind Pereira ( http://robotics.usc.edu/~ampereir/wordpress/?p=626 ) 에서 무언가를 발견하고 나를 위해 일하는 것 같았습니다.

plt.savefig(filename, transparent = True, bbox_inches = 'tight', pad_inches = 0)

7
transparent=True문제가없는 것처럼 보이지만 공백을 숨기고 이미지 크기는 좋지 않습니다.
Vlady Veselinov

언급 해 주셔서 감사합니다 pad_inches! 나는이 옵션을 더 일찍 알고 있었으면 좋겠다!
ingomueller.net

1
이것은 대부분의 플롯에서 작동하지만 혼동 행렬의 오른쪽 경계를 제거했습니다. 작은 패딩 만 추가pad_inches=.25
YTZ

14

다음 함수는 위의 johannes-s 답변을 통합합니다. 나는 그것을 테스트 한 plt.figureplt.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')

매력처럼 일했다. 이전 답변은 내 수출에 필요한 명령이었습니다.
케빈 S

11

다음 코드가 작업에 완벽하게 작동한다는 것을 알았습니다.

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)

2
일반적으로 코드의 목적과 다른 언어를 도입하지 않고 문제를 해결하는 이유에 대한 설명이 포함되어 있으면 답변이 훨씬 유용합니다.
Tim Diekmann

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)

1
사실, 나는이 대답이 쉽고 사용하기 편리하다는 것을 알았습니다.
sikisis

1
이것은 나를 위해 일했습니다. 받아 들여진 대답은 그렇지 않았다.
Joe

3

인치가 아닌 픽셀 단위로 작업하려는 사람에게는 이것이 효과가 있습니다.

게다가 평소에도 필요합니다

from matplotlib.transforms import Bbox

그런 다음 다음을 사용할 수 있습니다.

my_dpi = 100 # Good default - doesn't 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)

여기에 이미지 설명을 입력하십시오


당신은, dpi로 지정하지 않아도 당신은 기본 하나를 사용할 수 있습니다 fig.dpi대신
intsco

1

내가 찾은 훨씬 간단한 접근법은 다음을 사용하는 것입니다 plt.imsave.

    import matplotlib.pyplot as plt
    arr = plt.imread(path)
    plt.imsave('test.png', arr)

과소 평가. 이를 통해 해상도를 유지하고 공백을 제거하는 방법을 오랫동안 검색 한 후 도움이되었습니다 plt.savefig().
nihal111

배열 (!)을 이미지로 저장하려는 경우에만 작동합니다. 이것은 임의의 숫자를 저장할 수 없습니다.
MaxPowers

임의의 이미지 란 무엇입니까? 이미지가 값의 배열이 아닌가?
Parth92

0

시도해 볼 수 있습니다. 내 문제가 해결되었습니다.

import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img, cmap=cmap)

-1

저장할 내용을 표시하려면 사용할 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')

-4

이것은 imshow로 플롯 된 numpy 배열을 파일에 저장하는 데 효과적입니다.

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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.