matplotlib에서 많은 서브 플롯으로 서브 플롯 크기 / 간격 개선


313

이 질문 과 매우 유사 하지만 내 그림이 필요한만큼 커질 수 있다는 차이점이 있습니다.

matplotlib에 수직으로 쌓인 플롯을 모두 생성해야합니다. 결과는 figsave를 사용하여 저장되고 웹 페이지에서 볼 수 있으므로 하위 그림이 간격을두고 겹치지 않는 한 최종 이미지의 높이는 중요하지 않습니다.

내가 얼마나 큰 숫자를 허용하더라도 하위 그림은 항상 겹치는 것처럼 보입니다.

내 코드는 현재

import matplotlib.pyplot as plt
import my_other_module

titles, x_lists, y_lists = my_other_module.get_data()

fig = plt.figure(figsize=(10,60))
for i, y_list in enumerate(y_lists):
    plt.subplot(len(titles), 1, i)
    plt.xlabel("Some X label")
    plt.ylabel("Some Y label")
    plt.title(titles[i])
    plt.plot(x_lists[i],y_list)
fig.savefig('out.png', dpi=100)

답변:


413

사용해보십시오 plt.tight_layout

간단한 예를 들면 다음과 같습니다.

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=4, ncols=4)
fig.tight_layout() # Or equivalently,  "plt.tight_layout()"

plt.show()

단단한 레이아웃없이

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


단단한 레이아웃 여기에 이미지 설명을 입력하십시오


21
플롯 코드 다음에이를 실행해야하지만 show () 직전에 실행해야한다는 것이 조금 더 명확합니다.
pyj

5
tight_layout()맞았다. 종종 - 나는 그것이 효과 (대형 간 플롯 마진 유지)가 없을 때 다른 무엇인지 이해하려고 노력 했어요
javadba

3
이것은 내 그림 제목 ( suptitle)을 서브 플롯 제목과 겹쳐 놓은 것을 제외하고는 꽤 잘 작동했습니다 . 누구든지 비슷한 문제가 발생하면 내 사례 stackoverflow.com/a/45161551/11740420에 도움이되었습니다 . 즉,recttight_layout()
Siyana Pavlova

284

plt.subplots_adjust서브 플롯 (소스) 간 간격을 변경하는 데 사용할 수 있습니다.

통화 서명 :

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

매개 변수 의미 (및 제안 된 기본값)는 다음과 같습니다.

left  = 0.125  # the left side of the subplots of the figure
right = 0.9    # the right side of the subplots of the figure
bottom = 0.1   # the bottom of the subplots of the figure
top = 0.9      # the top of the subplots of the figure
wspace = 0.2   # the amount of width reserved for blank space between subplots
hspace = 0.2   # the amount of height reserved for white space between subplots

실제 기본값은 rc 파일에 의해 제어됩니다


3
hspace를 망쳐 봤지만 증가하면 겹침 문제를 해결하지 않고 모든 그래프를 작게 만드는 것 같습니다. 다른 매개 변수를 사용해 보았지만 실제로 왼쪽, 오른쪽, 아래쪽 및 위쪽이 무엇인지 지정하고 있지 않습니다.
mcstrother

52
@mcstrother 플롯을 표시 한 후 '조정'버튼을 클릭하면 6 개의 모든 매개 변수를 대화식으로 변경 한 다음 작동하는 것을 찾으면 코드에 복사 할 수 있습니다.
Nick T

1
조정 버튼이 보이지 않습니다. 나는 Jupyter 노트북에 있지만. % matplotlib 인라인 및 % matplotlib 노트북을 사용해 보았습니다.
매트 클라인 스미스

1
@MattKleinsmith : 조정 버튼에 호버 텍스트 "서브 플롯 구성"이 있으며 Matplotlib을 노트북이 아닌 일반 용도로 사용합니다. "플로피 디스크"저장 버튼의 왼쪽에있는 버튼입니다 : pythonspot-9329.kxcdn.com/wp-content/uploads/2016/07/…-사용 중인 윈도우 시스템에 따라 버튼이 다르게 나타납니다 사용하지만 항상 저장 버튼의 왼쪽에 있습니다.
존 즈 빙크

@JohnZwinck, 귀하의 의견에 대한 링크가 현재 종료되었습니다.
user4015990 2016 년

56

subplots_adjust (hspace = 0.001)이 저에게 효과적이라는 것을 알았습니다. space = None을 사용하면 각 플롯 사이에 여전히 공백이 있습니다. 그러나 0에 매우 가까운 것으로 설정하면 줄을서야합니다. 내가 여기에 업로드 한 것은 가장 우아한 코드는 아니지만 hspace의 작동 방식을 볼 수 있습니다.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tic

fig = plt.figure()

x = np.arange(100)
y = 3.*np.sin(x*2.*np.pi/100.)

for i in range(5):
    temp = 510 + i
    ax = plt.subplot(temp)
    plt.plot(x,y)
    plt.subplots_adjust(hspace = .001)
    temp = tic.MaxNLocator(3)
    ax.yaxis.set_major_locator(temp)
    ax.set_xticklabels(())
    ax.title.set_visible(False)

plt.show()

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


31
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,60))
plt.subplots_adjust( ... )

plt.subplots_adjust의 방법 :

def subplots_adjust(*args, **kwargs):
    """
    call signature::

      subplots_adjust(left=None, bottom=None, right=None, top=None,
                      wspace=None, hspace=None)

    Tune the subplot layout via the
    :class:`matplotlib.figure.SubplotParams` mechanism.  The parameter
    meanings (and suggested defaults) are::

      left  = 0.125  # the left side of the subplots of the figure
      right = 0.9    # the right side of the subplots of the figure
      bottom = 0.1   # the bottom of the subplots of the figure
      top = 0.9      # the top of the subplots of the figure
      wspace = 0.2   # the amount of width reserved for blank space between subplots
      hspace = 0.2   # the amount of height reserved for white space between subplots

    The actual defaults are controlled by the rc file
    """
    fig = gcf()
    fig.subplots_adjust(*args, **kwargs)
    draw_if_interactive()

또는

fig = plt.figure(figsize=(10,60))
fig.subplots_adjust( ... )

그림의 크기가 중요합니다.

"나는 hspace로 혼란을 시도했지만 그것을 늘리면 오버랩 문제를 해결하지 않고 모든 그래프를 작게 만드는 것 같습니다."

따라서 더 많은 공백을 만들고 하위 플롯 크기를 유지하려면 총 이미지가 더 커야합니다.


2
그림의 크기가 중요합니다. 더 큰 그림 크기는이 문제를 해결할 수 있습니다! set plt.figure(figsize=(10, 7)), 사진의 크기는 2000 x 1400pix입니다
Belter


20

tight_layout현재 matplotlib 와 유사합니다 (버전 2.2 기준) constrained_layout. 대조적으로 tight_layout하나의 최적화 된 배치에 대한 코드의 임의의 시간이라고 할 수있다, constrained_layout활성화 될 수 있고 모든 드로잉 공정 전에 레이아웃을 optimze하는 속성이다.

따라서 서브 플롯 생성 전 또는 동안 (예 : figure(constrained_layout=True)또는)을 활성화해야합니다 subplots(constrained_layout=True).

예:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(4,4, constrained_layout=True)

plt.show()

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

constrained_layout은 다음을 통해 설정할 수도 있습니다. rcParams

plt.rcParams['figure.constrained_layout.use'] = True

참고 항목 의 새로운 항목제한된 레이아웃 가이드


1
이것을 시도해보십시오 :이 옵션을 보지 tight_layout
못했고

이것은 유망한 것처럼 들리지만 충분한 간격 (축 레이블과 제목이 여전히 겹쳐 있음)을 제공하지 못하고 렌더링 시간이 훨씬 오래 걸렸습니다. tight_layout()더 잘 작동
craq

2
@craq 맞습니다. contrained_layout이 답변에서 볼 수 있듯이 모든 드로잉 단계 전에 레이아웃을 최적화 하기 때문에 일반적 으로 속도가 느립니다 .
중요도

나에게 이것은 가장 유용한 대답이었다.-나를 위해 tight_layout은 항상 패널 제목을위한 공간을 남겨두기 위해 수직 간격을 개선하지만 매번 y 축 레이블을 잘라내는 비용이 든다. 대신, 이것은 완벽하게 작동합니다. 감사합니다.
Adrian Tompkins
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.