본문 바로가기
데이터 분석/시각화

[Matplotlib Tip] 1. subplot 겹치지 않게 하기

by 부자 꽁냥이 2021. 5. 26.

안녕하세요~ 꽁냥이에요.

 

시각화 작업을 하다 보면 종종 여러 개 subplot을 그려야 하는 경우가 있을 것입니다. 아래처럼 말이죠.

 

 

위 그림에서는 4개의 subplot을 그린 것입니다. 별로 문제될 건 없어 보입니다. 하지만 아래와 같은 경우는 어떨까요?

 

 

보시는 바와 같이 subplot들이 겹쳐있습니다. 이번 포스팅에서는 subplot들이 겹쳐 있는 경우 어떻게 해결하는지 알아보겠습니다. 여기서 소개할 방법은 2가지이며 다음과 같습니다.

 

1. tight_layout을 이용하는 방법

2. subplots_adjust을 이용하는 방법


   1. tight_layout을 이용하는 방법

Matplotlib에서는 tight_layout을 이용하여 subplot들이 겹치지 않도록 최소한의 여백을 만들어주는 역할을 합니다. tight_layout의 작동방식은 다음 그림과 같이 전체 figure의 크기는 변화시키지 않은 채 중앙에서 가로방향 세로 방향으로 여백을 만들어 나가며 그에 따라 subplot이 적정 비율로 줄어들게 됩니다.

 

 

사용법은 먼저 Subplot을 다 그려주고 마지막에 plt.tight_layout을 호출하면 됩니다. 아래 코드처럼 말이죠.

 

np.random.seed(10)
size = 5

numdays = 5
now = datetime.now()
date_list = [(now - timedelta(days=x)).strftime('%Y-%m-%d') for x in range(numdays)]

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')
for i in range(4):
    ax = fig.add_subplot(220+i+1)
    y = np.random.randn(size)
    ax.scatter(date_list,y)
    ax.set_title(f'Scatter Plot - {i}')
    ax.set_ylabel('Y Label')
    ax.set_xlabel('X Label')
    for tick in ax.get_xticklabels():
        tick.set_rotation(90)

plt.tight_layout() ## <--마지막에 호출
plt.show()

 

 

코드를 실행해보면 겹치지 않게 잘나온 것을 확인할 수 있습니다.

만약 가로 여백, 세로 여백을 따로 주고 싶다면 아래 코드와 같이 w_pad, h_pad를 이용하면 됩니다.

 

np.random.seed(10)
size = 5

numdays = 5
now = datetime.now()
date_list = [(now - timedelta(days=x)).strftime('%Y-%m-%d') for x in range(numdays)]

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')
for i in range(4):
    ax = fig.add_subplot(220+i+1)
    y = np.random.randn(size)
    ax.scatter(date_list,y)
    ax.set_title(f'Scatter Plot - {i}')
    ax.set_ylabel('Y Label')
    ax.set_xlabel('X Label')
    for tick in ax.get_xticklabels():
        tick.set_rotation(90)

plt.tight_layout(h_pad=5, w_pad=8)
plt.show()

 

 

코드를 실행하면 위와 같이 가로, 세로 여백이 다르게 적용된 것을 알 수 있습니다. tight_layout에 대해 더 자세히 알고 싶으신 분들은 여기에 들어가셔서 개발 문서를 확인해보세요.

반응형

   2. subplots_adjust을 이용하는 방법

subplots_adjust도 tight_layout과 작동 방식이 비슷합니다. 하지만 tight_layout은 인자를 넣지 않아도 subplot을 잘 분리해주는 반면 subplots_adjust는 인자를 넣어주어야 동작합니다. 아래 코드는 subplots_adjust에 아무것도 넣지 않았습니다.

 

np.random.seed(10)
size = 5

numdays = 5
now = datetime.now()
date_list = [(now - timedelta(days=x)).strftime('%Y-%m-%d') for x in range(numdays)]

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')
for i in range(4):
    ax = fig.add_subplot(220+i+1)
    y = np.random.randn(size)
    ax.scatter(date_list,y)
    ax.set_title(f'Scatter Plot - {i}')
    ax.set_ylabel('Y Label')
    ax.set_xlabel('X Label')
    for tick in ax.get_xticklabels():
        tick.set_rotation(90)

plt.subplots_adjust()
plt.show()

 

 

코드를 실행하면 보시는 바와 같이 변한 것이 없습니다. subplot이 겹치지 않도록 하기 위해 subplots_adjust의 w_space, h_space 인자에 값을 지정해야 합니다. 이 값은 보통 0과 1 사이에 값을 넣습니다.

 

np.random.seed(10)
size = 5

numdays = 5
now = datetime.now()
date_list = [(now - timedelta(days=x)).strftime('%Y-%m-%d') for x in range(numdays)]

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')
for i in range(4):
    ax = fig.add_subplot(220+i+1)
    y = np.random.randn(size)
    ax.scatter(date_list,y)
    ax.set_title(f'Scatter Plot - {i}')
    ax.set_ylabel('Y Label')
    ax.set_xlabel('X Label')
    for tick in ax.get_xticklabels():
        tick.set_rotation(90)

plt.subplots_adjust(hspace=0.8,wspace=0.5)
plt.show()

 

보시는 바와 같이 subplot들이 겹치지 않게 잘 보이고 있습니다.


이번 포스팅에서는 subplot들이 겹치지 않도록 하기 위한 방법을 알아보았습니다. tight_layout과 subplots_adjust를 이용한 방법을 알아보았구요. 

 

꽁냥이는 개인적으로 사용이 편한 tight_layout을 사용하시길 추천합니다.

 

이 포스팅이 도움이 되셨으면 좋겠습니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다. 안녕히 계세요~

 


 

댓글


맨 위로