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

[Matplotlib] 여러 그래프 그릴 때 x축 , y축 범위 공유하기 (feat. sharex, sharey)

by 부자 꽁냥이 2022. 11. 5.

안녕하세요~ 꽁냥이입니다. 여러 그래프를 그릴 때 때로는 y축(또는 x축)의 범위를 통일시킬 필요가 있습니다. 같은 스케일에서 비교를 용이하게 하기 위함이지요. Matplotlib에서는 sharex, sharey를 이용하여 축 범위를 통일시킬 수 있습니다. 이번 포스팅에서는 Matplotlib에서 여러 그래프를 그릴 때 x축, y축 범위를 공유하는 방법을 알아보겠습니다. 


   축 범위 공유하기 (feat. sharex, sharey)

우선 여러 그래프를 그릴 때에는 subplots를 사용하는데 sharex, sharey 인자는 각각 x, y축 범위를 통일시킬 수 있게하는 인자입니다. sharex(또는 sharey)는 부울(bool) 값을 받거나 'none', 'all', 'row', 'col' 4가지 타입의 문자열을 받습니다. 문자열의 의미는 아래와 같습니다.

 

'none' : 축 범위 공유안함,

'all' : 모든 그래프에 대하여 범위 공유,

'row' : 행 방향으로 범위 공유,

'col' : 열 방향으로 범위 공유

 

이때 'none'은 False와 같고 'all'은 True와 같습니다.

 

이제 사용법을 구체적으로 알아보겠습니다. 아래 코드는 x, y축 범위를 하나도 공유하지 않는 그래프 4개를 그립니다.

 

import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus'] = False
import numpy as np

## generate toy data
np.random.seed(100)
sample_size = 50
x = [np.random.rand(sample_size)+i for i in range(4)]
y = [np.random.randn(sample_size)*(2/(i+1))+i for i in range(4)]

sharey = 'none' ## 또는 sharey=False
sharex = 'none' ## 또는 sharex=False
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, 
                                             sharey=sharey, 
                                             sharex=sharex, 
                                             figsize=(8,8)
                                            )
fig.set_facecolor('white')

ax1.scatter(x[0], y[0])
ax2.scatter(x[1], y[1])
ax3.scatter(x[2], y[2])
ax4.scatter(x[3], y[3])
plt.suptitle(f"sharey : {sharey}, sharex : {sharex}", y=0.95, fontsize=15)
plt.show()

위 그림을 보면 모든 축이 각자 범위대로 그려진 것을 알 수 있습니다. sharex, sharey 각각 4가지 타입의 범위를 지정할 수 있으므로 총 16가지 방법으로 축 범위를 공유할 수 있습니다. 아래 그래프는 sharex를 'none'으로 고정시켜놓고 sharey를 바꿔보면서 그린 결과입니다. 

sharey='none'(왼쪽), sharey='all'(오른쪽)
sharey='row'(왼쪽), sharey='col'(오른쪽)

이때 row와 all의 차이점은 row는 같은 행의 있는 데이터의 범위를 통일시키는 것이며 행이 다른 경우 범위가 달라집니다. 하지만 all은 모든 행에 대하여 범위가 같습니다. col도 이와 비슷합니다.


sharex, sharey를 이용하면 set_xlim이나 set_ylim을 이용하여 일일이 지정할 필요가 없이 범위를 통일시킬 수 있습니다. 이번 내용은 자주 사용되는 내용이므로 기억해두시면 좋습니다. 다음에도 좋은 주제로 찾아뵐 것을 약속드리며 이상 포스팅 마치겠습니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다.


댓글


맨 위로