2022-06-21 20:06:37

matplotlib를 이용해서 그래프를 그릴 때 하나의 화면에 여러 개의 그래프를 동시에 그리고 싶은 경우도 있지만, 화면을 분할해서 그래프를 각각 그리고 싶은 경우도 있습니다. 오늘은 후자에 대한 글을 쓰도록 하겠습니다.

 

2개 그래프 서브플롯으로 그리기

우선 2020년 제 블로그 일별 페이지뷰 수를 담고 있는 데이터프레임 df_2020과 2021년 페이지뷰 수를 담고 있는 데이터프레임 df_2021이 있다고 가정하고 예시를 보여드리겠습니다. df_2020과 df_2021은 각각 다음과 같이 생겼습니다.

 

 

저는 각각의 그래프를 2개의 서브플롯으로 그릴 것입니다. 우선 본질에 집중하기 위해 그래프를 꾸미는 것은 최소화하겠습니다. 전체 코드는 문서 최하단에 공유하겠습니다. 여기서는 중요한 부분만 잘라서 보여드리겠습니다.

 

fig = plt.figure(figsize=(14, 5)) # 그림 사이즈 지정 (가로 14인치, 세로 5인치)
ax1 = fig.add_subplot(2, 1, 1) # 서브플롯들을 2 x 1 배열로 배치 그중 첫번째
ax2 = fig.add_subplot(2, 1, 2) # 서브플롯들을 2 x 1 배열로 배치 그중 두번째

ax1.plot(df_2020['일 색인'], df_2020['페이지뷰 수'])
ax2.plot(df_2021['일 색인'], df_2021['페이지뷰 수'])

plt.show()

 

우선 아래와 같이 2020년 일별 페이지뷰 그래프와 2021년 일별 페이지뷰 그래프가 두 개의 서브플롯으로 잘 그려졌습니다. 

 

 

서브 플롯 꾸미기

하지만 조금 더 꾸며줘야 데이터가 잘 설명될 것 같습니다. y축의 범위를 통일해주고, grid도 추가해주고, x축 라벨, y축 라벨, 범례(legend), 제목 등을 추가해주도록 하겠습니다.

 

fig = plt.figure(figsize=(14, 7)) # 그림 사이즈 지정 (가로 14인치, 세로 5인치)
fig.suptitle('bskyvision 2020 and 2021 page views comparison')

ax1 = fig.add_subplot(2, 1, 1) # 서브플롯들을 2 x 1 배열로 배치 그중 첫번째
ax2 = fig.add_subplot(2, 1, 2) # 서브플롯들을 2 x 1 배열로 배치 그중 두번째

ax1.plot(df_2020['일 색인'], df_2020['페이지뷰 수'], color='blue', label='2020')
ax2.plot(df_2021['일 색인'], df_2021['페이지뷰 수'], color='red', label='2021')

ax1.legend(loc='best')
ax2.legend(loc='best')

ax1.grid(True)
ax2.grid(True)

ax1.set_ylim(0, 8000)
ax2.set_ylim(0, 8000)

ax1.set_xlabel('Date')
ax2.set_xlabel('Date')

ax1.set_ylabel('page views')
ax2.set_ylabel('page views')

plt.show()

 

몇 줄의 코드를 추가해주니 훨씬 보기 좋아졌죠? 2021년이 전체적으로 2020년에 비해 일별 페이지뷰 수가 많은 것을 알 수 있습니다.

 

 

서브플롯을 꾸미기 위해 추가로 사용된 메소드들을 정리해보겠습니다. 

 

1) 그리드(grid)를 넣을 때 - axe 객체의 grid 메소드

2) 범례를 넣을 때 - axe 객체의 legend 메소드

3) y축의 범위를 지정할 때 - axe 객체의 set_ylim 메소드

4) x축 라벨과 y축 라벨을 설정할 때 - axe 객체의 set_xlabel 메소드와 set_ylabel 메소드

5) 전체 플롯의 제목을 설정할 때 - Figure 객체의 suptitle 메소드

 

전체 코드 공유

전체 파이썬 코드는 다음과 같습니다. 각자의 상황에 맞게 응용하셔서 사용하시길 바랍니다. 

 

import pandas as pd 
import matplotlib.pyplot as plt

# 엑셀 파일 데이터프레임으로 가져오기
df_page_views = pd.read_excel('page_view.xlsx', sheet_name='데이터세트1')
print(df_page_views)

# 컬럼 데이터 타입 확인
print(df_page_views.dtypes)

df_2020 = df_page_views[df_page_views['일 색인'].between('2020-01-01', '2020-12-31')]
print(df_2020)

df_2021 = df_page_views[df_page_views['일 색인'].between('2021-01-01', '2021-12-31')]
print(df_2021)

fig = plt.figure(figsize=(14, 7)) # 그림 사이즈 지정 (가로 14인치, 세로 5인치)
fig.suptitle('bskyvision 2020 and 2021 page views comparison')

ax1 = fig.add_subplot(2, 1, 1) # 서브플롯들을 2 x 1 배열로 배치 그중 첫번째
ax2 = fig.add_subplot(2, 1, 2) # 서브플롯들을 2 x 1 배열로 배치 그중 두번째

ax1.plot(df_2020['일 색인'], df_2020['페이지뷰 수'], color='blue', label='2020')
ax2.plot(df_2021['일 색인'], df_2021['페이지뷰 수'], color='red', label='2021')

ax1.legend(loc='best')
ax2.legend(loc='best')

ax1.grid(True)
ax2.grid(True)

ax1.set_ylim(0, 8000)
ax2.set_ylim(0, 8000)

ax1.set_xlabel('Date')
ax2.set_xlabel('Date')

ax1.set_ylabel('page views')
ax2.set_ylabel('page views')

plt.show()

 

관련 글

- [python + matplotlib] matlab과 비슷한 방식으로 plot 그리기, matplotlib.pyplot  

- [Anaconda+python] CIFAR-10 데이터셋으로 이미지 분류기 만들기 (컨볼루션 신경망)  

- [MATLAB] 폴더 속의 이미지 파일들의 이름을 읽어내고 싶을 때는?, dir 함수