scipy : 프레임, 축, 콘텐츠 만없는 savefig


92

numpy / scipy에는 이미지가 배열에 저장되어 있습니다. 표시 할 수 있습니다. 테두리, 축, ​​레이블, 제목 savefig 없이 사용하여 저장하고 싶습니다 . 순수한 이미지 만 있으면됩니다.

내가 좋아하는 패키지를 피하려고 PyPNG또는 scipy.misc.imsave그들은 항상 기본적인 잘 설치하지 마십시오 (그들은 때로는 문제가있다, savefig()나를 위해

답변:


115

편집하다

변경 aspect='normalaspect='auto'즉하기 matplotlib의 최신 버전 (Luke19 @ 덕분에) 변화하기 때문이다.


가정 :

import matplotlib.pyplot as plt

프레임없이 그림을 만들려면 :

fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)

내용을 전체 그림으로 채우려면

ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)

그런 다음 이미지를 그립니다.

ax.imshow(your_image, aspect='auto')
fig.savefig(fname, dpi)

aspect매개 변수는 반드시 그들이에 지정된 숫자의 크기를 채울 수 있도록 픽셀 크기를 변경합니다 fig.set_size_inches(…). 이러한 종류의 작업을 수행하는 방법을 알아 보려면 특히 Axes, Axis 및 Artist 주제에 대한 matplotlib의 문서를 읽어보십시오 .


4
아니, 여전히 작은 투명 테두리가 있고 내가 원하는 것은 테두리전혀없는 순수한 이미지
Jakub M.

5
수동으로 설정 한 경우 wh의 매개 변수를 fig.set_size_inches(w,h)하고 dpi있는 매개 변수 fig.savefig(fname, dpi)그래서 24 픽셀로 24 픽셀이 발생할 것을, 그것은 잘 작동합니다. 예를 들어, w = h = 1그리고dpi = 24
matehat

5
나는이 대답과 Mostafa Pakparvar의 아래 대답을 결합해야했습니다. 축을 꺼야 할뿐만 아니라 공백이 사라지도록하려면 set_visible을 false로 설정해야합니다. (wtf?)
Bryce Guinta

6
matplotlib v2.2.2를 사용하여 이것을 시도했지만 완벽하게 작동했습니다 ( imshow의 구문이 aspect='auto'대신으로 변경되었습니다 'normal').
Luke19

2
이것이 올바른 접근 방식입니다. ax = plt.Axes(fig, [0., 0., 1., 1.])그것이 작동하게 만드는 것입니다.
greatvovan

73

더 쉬운 해결책은 다음과 같습니다.

fig.savefig('out.png', bbox_inches='tight', pad_inches=0)

2
이것은 나를 위해 잘 작동했습니다. 또한 pad_inches는 원하는 크기로 쉽게 변경할 수 있습니다. 감사!
Curious2learn

27
이것으로 여전히 흰색 여백이 있습니다.
Fábio Perez

3
새로운 버전 / 남은 여백 문제에 대해 transparent = True를 추가하여 업데이트 할 수있었습니다 fig.savefig('out.png', bbox_inches='tight',transparent=True, pad_inches=0)
mdoc-2011

2
여전히 축과 눈금 및 이것으로 모든 것을 얻었습니다 :(
BjornW

3
이것은 아무것도하지 않습니다. 모든 축과 레이블이있는 그림을 제공합니다.
1313e 2018

27

축 내에서 이미지의 bbox를 찾고 (사용 get_window_extent) bbox_inches매개 변수를 사용 하여 이미지의 해당 부분 만 저장할 수 있습니다.

import numpy as np
import matplotlib.pyplot as plt

data=np.arange(9).reshape((3,3))
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
plt.axis('off')
plt.imshow(data)

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

나는 여기 에서 Joe Kington에게서이 트릭을 배웠다 .


6
그냥 plt.axis('off')도왔습니다. 다른 답변은별로 도움이되지 않습니다.
imsrgadich

3
이것은 꽤 잘 작동했습니다. 그러나 제 경우에는 여전히 작은 흰색 테두리가 있습니다. 이 테두리를 제거하는 방법에 대한 아이디어가 있습니까?
user3731622

@ user3731622, plt.savefig('/temp/test.png', bbox_inches='tight', transparent=True, pad_inches=0)대신 시도해주세요plt.savefig('/tmp/test.png', bbox_inches=extent)
Cloud Cho

17

제 경우에는 몇 가지 옵션을 시도했는데 가장 좋은 해결책은 다음과 같습니다.

fig.subplots_adjust(bottom = 0)
fig.subplots_adjust(top = 1)
fig.subplots_adjust(right = 1)
fig.subplots_adjust(left = 0)

그런 다음 그림을 저장하십시오. savefig


1
이 모든 솔루션 중에서 이것이 나를 위해 일한 유일한 솔루션입니다.
Puff

8

bbox를 타이트 모드로 설정 한 후 남은 패딩을 제거하기 위해 여기 에서 약간의 추가를 빌려 heron13 답변을 제안 합니다.

axes = fig.axes()
axes.get_xaxis().set_visible(False)
axes.get_yaxis().set_visible(False)
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)

get_xaxis () 및 get_yaxis ()가 존재하지 않는다는 오류가 발생합니다. 왜 그런 일이 일어날 지 아십니까?
Jacob Malachowski

() 객체를 축 확인한 다음 ax.xaxis을 사용하고 ax.yaxis
perigon

라는 오류가있어 '목록'개체가 어떤 속성 'get_xaxis'가 없다
Haozhe시에

7

이것은 나를 위해 일합니다

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

3

다른 정보없이 플롯의 내용을 추출하려는 librosa를 사용하여 시각화를 수행하는 동안 동일한 문제가 발생했습니다 . 그래서 이것은 나의 접근 방식입니다. unutbu 대답은 또한 내가 일할 수 있도록 도와줍니다.

    figure = plt.figure(figsize=(500, 600), dpi=1)
    axis = plt.subplot(1, 1, 1)
    plt.axis('off')
    plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off',
                    labelright='off', labelbottom='off')

     # your code goes here. e.g: I used librosa function to draw a image
    result = np.array(clip.feature_list['fft'].get_logamplitude()[0:2])
    librosa.display.specshow(result, sr=api.Clip.RATE, x_axis='time', y_axis='mel', cmap='RdBu_r')


    extent = axis.get_window_extent().transformed(figure.dpi_scale_trans.inverted())
    plt.savefig((clip.filename + str("_.jpg")), format='jpg', bbox_inches=extent, pad_inches=0)
    plt.close()

이로 인해 올바른 길을 찾게되었지만 두 가지 문제가있었습니다. 1) jupyter 노트북에서 글꼴 오류를 피하기 위해 dpi를 1보다 큰 숫자로 설정해야했습니다. 2) 여전히 작은 테두리가 있었으므로 Bbox 범위를 수동으로 변경해야합니다 extent.get_points()*np.array([[1.1],[.9]]).
Bob Baxley 2017

다른 사람에게 도움이 될 수있는 답변을 채워 주셔서 감사합니다.
GPrathap

3

Jupyter에서이 작업을 수행하려는 사람을 위해

 plt.axis('off')

 spec = plt.imshow

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

2

위의 답변은 여백 및 패딩 제거를 다루지 만 레이블 제거에는 효과가 없었습니다. 나중에이 질문을 우연히 발견 한 사람에게 효과가 있었던 것은 다음과 같습니다.

에 저장된 4 개의 이미지에서 2x2 서브 플롯 그리드를 원한다고 가정합니다 images.

matplotlib.pyplot.figure(figsize = (16,12)) # or whatever image size you require
for i in range(4):
    ax = matplotlib.pyplot.subplot(2,2,i+1)
    ax.axis('off')
    imshow(images[i])
matplotlib.pyplot.savefig(path, bbox_inches='tight')

1

여기 팁을 사용하여 테두리를 제거하려고 시도했지만 실제로 효과가 없었습니다. 약간 어슬렁 거리면서 나는 안면을 바꾸는 것이 jupyter labs에서 나에게 경계선을주지 않는다는 것을 발견했다 (어떤 색깔이든지 흰색 경계선을 없앴다). 도움이 되었기를 바랍니다.

def show_num(data):
data = np.rot90(data.reshape((16,16)), k=3)
data = np.fliplr(data)
fig = plt.figure(frameon=False, facecolor='white')
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(data)
plt.show()

여기에 이미지 설명 입력



0

나를 위해이 코드는 matehat , unutbuWHZW 코드 에서 프레임과 축없이 입력 이미지 크기를 비슷하게 만들었습니다 .

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plt.axis('off')
viridis = cm.get_cmap('gist_gray', 256)
plt.imshow(data, aspect='auto', cmap=viridis)
plt.tight_layout()
plt.savefig(out_file, bbox_inches='tight', transparent=True, pad_inches=0)

런타임 환경 :
Python 3.6.10
Matplotlib 3.2.1
OS Windows 10

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