코딩/pandas, matplotlib

[python + pandas] 그래프 여러 개 서브플롯(subplot)으로 그리기

비스카이비전 2022. 6. 21. 20:06

안녕하세요. 비스카이비전입니다. 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축 라벨, 범례, 타이틀 등을 추가해주도록 하겠습니다.

 

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) 그리드를 넣을 때 - 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 함수