안녕하세요~ 꽁냥이에요.
시각화 작업을 하다 보면 종종 여러 개 subplot을 그려야 하는 경우가 있을 것입니다. 아래처럼 말이죠.
위 그림에서는 4개의 subplot을 그린 것입니다. 별로 문제될 건 없어 보입니다. 하지만 아래와 같은 경우는 어떨까요?
보시는 바와 같이 subplot들이 겹쳐있습니다. 이번 포스팅에서는 subplot들이 겹쳐 있는 경우 어떻게 해결하는지 알아보겠습니다. 여기서 소개할 방법은 2가지이며 다음과 같습니다.
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을 사용하시길 추천합니다.
이 포스팅이 도움이 되셨으면 좋겠습니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다. 안녕히 계세요~
'데이터 분석 > 시각화' 카테고리의 다른 글
[Matplotlib Tip] 2. numpy.histogram을 이용하여 히스토그램 그리기 (1115) | 2021.06.12 |
---|---|
[Matplotlib Tip] 2. 산점도에 회귀 직선(곡선) 포함시키기 (1113) | 2021.05.28 |
[산점도(Scatter Plot)] 2. Matplotlib을 이용하여 산점도 멋지게 만들어보기 (1130) | 2021.05.22 |
[산점도(Scatter Plot)] 1. Matplotlib을 이용하여 산점도 그리기 (1112) | 2021.05.21 |
Matplotlib 그래프의 눈금(Tick) 조절하기 (1098) | 2021.05.05 |
댓글