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


178

matplotlib에서 플롯 마진을 처리하는 데 어려움을 겪고 있습니다. 아래 코드를 사용하여 차트를 생성했습니다.

plt.imshow(g)
c = plt.colorbar()
c.set_label("Number of Slabs")
plt.savefig("OutputToUse.png")

그러나 줄거리의 양쪽에 많은 공백이있는 출력 그림을 얻습니다. Google을 검색하고 matplotlib 설명서를 읽었지만 이것을 줄이는 방법을 찾지 못하는 것 같습니다.


문제가있는 공백의 양 extentimshow그림, 또는에 의해 생성 된 그림 주변의 결과 PNG의 경계 공백의 양, savefig?
unutbu

둘 다 생각합니다.보기 창과 PNG에 많은 공간이있는 것 같습니다. 그러나 중요한 결과는에 의해 생성 된 png 파일입니다. savefig그래서 정렬하고 싶습니다.
robintw

나는 나중에 김프에서 자르고 있습니다. : /
endolith

답변:


251

이 작업을 자동으로 수행하는 한 가지 방법은 bbox_inches='tight'kwarg to plt.savefig입니다.

예 :

import matplotlib.pyplot as plt
import numpy as np
data = np.arange(3000).reshape((100,30))
plt.imshow(data)
plt.savefig('test.png', bbox_inches='tight')

다른 방법은 사용하는 것입니다 fig.tight_layout()

import matplotlib.pyplot as plt
import numpy as np

xs = np.linspace(0, 1, 20); ys = np.sin(xs)

fig = plt.figure()
axes = fig.add_subplot(1,1,1)
axes.plot(xs, ys)

# This should be called after all axes have been added
fig.tight_layout()
fig.savefig('test.png')

5
이것을 기본값으로 설정하는 방법이 있습니까?
endolith

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

1
이 작업은 이미지가 렌더링 된 후 이미지를 자르기 만하면됩니다. 특정 해상도를 적용하려고하면 이미지가 작아집니다 .
detly

5
@detly-그렇습니다. 그것이 정확히하는 것입니다 (그러나 "잘라 내기"하여 이미지를 더 크게 만들 수도 있습니다). 당신이 원하는 것에 대해 살펴보십시오 fig.tight_layout(). 이 답변은 원래 작성되었을 때 해당 기능이 없었습니다. 그렇지 않으면 더 두드러지게 언급합니다.
Joe Kington

2
누군가 문제가 있다면fig = plt.gcf()
KyungHoon Kim

148

subplots_adjust () 함수를 사용하여 matplotlib 그림의 간격을 조정할 수 있습니다.

import matplotlib.pyplot as plt
plt.plot(whatever)
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)

이것은 화면상의 도형에 모두 작동하며 파일에 저장되며, 한 도형에 여러 플롯이없는 경우에도 호출하는 것이 올바른 기능입니다.

숫자는 그림 치수의 일부이며 그림 레이블을 허용하도록 조정해야합니다.


8
매개 변수에 할당 된 값은 얼마나 변경해야하는지가 아니라 여백을 설정하는 위치입니다. 즉, 오른쪽 가장자리 여백을 10 % 씩 가져 오려면 right = 0.1이 아니라 right = 0.9로 설정해야합니다. matplotlib.sourceforge.net/api/…
drootang

1
plt.subplots_adjust ()에 음수 값을 지정할 수 있음을 분명히 알 수 있습니다. 그렇게하면 그림 영역 바깥으로 그릴 수도 있고 성가신 여백을 처리 할 수 ​​있습니다.
15:02에

또한 메소드 GridSpec를 호출하여 객체에서 작동합니다 update( stackoverflow.com/a/20058199/1030876 참조 ).
Aaron Voelker

57

당신이 필요한 전부

plt.tight_layout()

당신의 출력 전에.

여백을 줄이는 것 외에도 하위 플로트 사이의 간격을 밀접하게 그룹화합니다.

x = [1,2,3]
y = [1,4,9]
import matplotlib.pyplot as plt
fig = plt.figure()
subplot1 = fig.add_subplot(121)
subplot1.plot(x,y)
subplot2 = fig.add_subplot(122)
subplot2.plot(y,x)
fig.tight_layout()
plt.show()

7
이것이 가장 좋은 방법이라고 생각합니다. `bbox = 'tight'와 같은 그림을 저장할 필요가 없으며 비좁은 그림의 다른 모든 레이아웃 문제를 해결합니다.
dshepherd

2
이미지 대신 그림에 적용될 때 예상대로 작동하므로 정답이어야합니다.
Majid alDosari

이상하게도 이것은 가장자리에있는 공백을 잘라내지만 플롯은 그대로 두는와 비교 하여 실제 플롯 의 너비 (즉, 피크가 서로 더 가깝습니다)를 변경합니다 bbox_inches='tight'. 로 그림을 만들었습니다 plt.figure(figsize=(10,3)).
프리츠

9

ax = fig.add_axes([left, bottom, width, height]) 그림 레이아웃을 정확하게 제어 하려면 사용 하십시오. 예.

left = 0.05
bottom = 0.05
width = 0.9
height = 0.9
ax = fig.add_axes([left, bottom, width, height])

6

plt.tight_layout()또는 적용 후 흰색 여백의 나머지 부분을 제거하는 방법을 궁금해하는 사람이있는 경우 fig.tight_layout(): 매개 변수 pad( 1.08기본적으로)를 사용하면 더 세밀하게 만들 수 있습니다. 하위 크기 (글꼴 크기의 일부)입니다. " 예를 들어

plt.tight_layout(pad=0.05)

아주 작은 여백으로 줄입니다. 퍼팅 0은 서브 플롯의 상자를 약간 잘라서 작동하지 않습니다.


4
plt.savefig("circle.png", bbox_inches='tight',pad_inches=-1)

1
"pad_inches = -1"은 savefig가 그림의 일부만 생성하게합니다.
Yu Shen

savefig함수 에서 매개 변수를 사용하는 것은 좋지만 pad_inches모든 경우에 음수 값 이 반드시 필요한 것은 아닙니다.
MichaelHuelsen

0으로 설정, 도움
Joop

4

matplotlibs subplots_adjust의 문제점은 입력 한 값이 그림의 x 및 y 그림 크기와 관련이 있다는 것입니다. 이 예는 PDF 인쇄를위한 정확한 수치를 보여줍니다.

이를 위해 다음과 같이 상대 간격을 절대 값으로 다시 계산합니다.

pyplot.subplots_adjust(left = (5/25.4)/figure.xsize, bottom = (4/25.4)/figure.ysize, right = 1 - (1/25.4)/figure.xsize, top = 1 - (3/25.4)/figure.ysize)

x- 차원의 'figure.xsize'인치와 y- 차원의 'figure.ysize'인치 그림. 따라서 전체 그림의 왼쪽 여백은 5mm, 아래쪽 여백은 4mm, 오른쪽 1mm, 상단 3mm입니다. mm를 인치로 변환해야하기 때문에 (x / 25.4)의 변환이 수행됩니다.

x의 순수 차트 크기는 "figure.xsize-왼쪽 여백-오른쪽 여백"이고 y의 순수 차트 크기는 "figure.ysize-아래쪽 여백-위쪽 여백"(인치)입니다.

다른 코드 조각

pyplot.figure(figsize = figureSize, dpi = None)

pyplot.savefig("outputname.eps", dpi = 100)

3
당신은 어디에서 얻었 는가 xsizeysize에서. 나는 그 속성들을 사용하고 다음을 얻는다AttributeError: 'Figure' object has no attribute 'xsize'
cj5

4

Sammys에서 영감을 얻은 위의 답변 :

margins = {  #     vvv margin in inches
    "left"   :     1.5 / figsize[0],
    "bottom" :     0.8 / figsize[1],
    "right"  : 1 - 0.3 / figsize[0],
    "top"    : 1 - 1   / figsize[1]
}
fig.subplots_adjust(**margins)

figsize는 당신이 사용한 튜플입니다. fig = pyplot.figure(figsize=...)


2

나에게 위의 답변 matplotlib.__version__ = 1.4.3은 Win7에서 작동하지 않았습니다 . 따라서 이미지 자체에만 관심이있는 경우 (즉, 주석, 축, 눈금, 제목, ylabel 등이 필요하지 않은 경우) 단순히 numpy 배열을 대신 이미지로 저장하는 것이 좋습니다 savefig.

from pylab import *

ax = subplot(111)
ax.imshow(some_image_numpyarray)
imsave('test.tif', some_image_numpyarray)

# or, if the image came from tiff or png etc
RGBbuffer = ax.get_images()[0].get_array()
imsave('test.tif', RGBbuffer)

또한 opencv 드로잉 함수 (cv2.line, cv2.polylines)를 사용하여 numpy 배열에서 직접 일부 드로잉을 수행 할 수 있습니다. http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html


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