- 시각화를 하다 보면 subplot을 자주 만듭니다.
- subplot을 만드는 방법은 matplotlib에만도 여러 가지가 있고, seaborn에서는 FacetPlot()을 이용해 데이터로부터 subplot을 만들 수도 있습니다.
- 관련 질문이 빈번하게 등장하여 종류별로 정리해 봤습니다.
0. 설정
- 시각화를 위한 라이브러리를 불러오고 한글 출력을 설정합니다.
1 | import matplotlib.pyplot as plt |
- Ridgeline Plot에 사용된 월별 기온 데이터를 활용합니다.
- 여기에서 다운로드받을 수 있습니다.
- 데이터 중 2016년만 선택해 월과 일평균기온만 남깁니다.
1 | df = pd.read_csv("end-part2_df.csv") |

- 이제부터 이 데이터로 이런 그림을 그리겠습니다.

1. Matplotlib state-based inteface
plt.plot()으로 대표되는 방법입니다.- 구성요소를 차례대로 만드는 방식으로 대부분의 matplotlib 교재와 강의에서 이렇게 시작합니다.
figure를 생성합니다.
- plot의 x와 y 범위를 동일하게 설정하기 위해 데이터로부터 범위를 추출합니다.
plt.subplot()으로 subplot을 생성합니다.
- subplot에 seaborn kdeplot()으로 그림을 그립니다.
plt.명령을 이용해 tick, grid, xlabel, ylabel 설정을 완료합니다.
plt.subplots_adjust()로 subplot 사이 간격을 조정합니다.
1 | # 1. matplotlib state-based |

-
그림을 그리기 전에 x 범위를 데이터로부터 먼저 구했습니다.
- 그러나 kdeplot의 특성상 plot이 실제 범위를 초과합니다.
- 그림이 밀도함수를 모두 담지 못하는 경우가 생깁니다.
-
상태기반 인터페이스는 밀도함수에 x 범위를 맞추기 어렵습니다.
- x 범위를 맞추려면 kdeplot을 그린 후에 범위를 추출해야 합니다.
- 하지만 순서대로 그리는 상태기반의 특성상 이 작업이 불가능합니다.
2. Matplotlib object-oriented (1)
- 객체지향 방식은 Figure와 Axes를 사용합니다.
fig = plt.figure()로 전체 공간을 먼저 정의하고,ax = fig.add_subplot()로 개별 공간을 만들 수 있습니다.
figure를 생성합니다.fig.add_subplot()으로 subplot을 생성합니다.
- subplot에 seaborn kdeplot()으로 그림을 그립니다.
- axes list를 이용해 저장해두고 제어합니다.
ax.명령을 이용해 tick, grid, xlabel, ylabel 설정을 완료합니다.
fig.subplots_adjust()로 subplot 사이 간격을 조정합니다.
1 | # 2. matplotlib object-oriented, ax.add_subplot() |

-
객체지향 방식은 그리는 순서에 구애받지 않습니다.
- axes를 만들어두고 나중에 접근할 수 있습니다.
- x 범위처럼 데이터 전체를 아우르는 기준 설정에 좋습니다.
-
text객체 위치 지정에 유리합니다.
transform인자로 개별 axes 기준 위치 지정이 가능합니다.- 화살표나 도형 삽입시에도 편리합니다.
3. Matplotlib object-oriented (2)
-
어차피 만들 figure와 axes를 한 번에 만들 수 있습니다.
fig, ax = plt.subplot()를 사용합니다.- 여러 인자를 사전에 지정할 수 있습니다.
- 덕택에 전체적으로 코드의 길이가 크게 줄어듭니다.
-
개인적으로 가장 선호하는 방식입니다.
figure와axes를 동시에 생성합니다.
- 생성과 동시에 세부 설정을 완료합니다.
for와enumerate로axes에 하나씩 접근합니다.
-
다른 방식에 비해 과정이 많이 절약됩니다.
-
ax.명령을 이용해 tick, grid, xlabel, ylabel 설정을 완료합니다. -
코드는 다음과 같습니다.
1 | # 3. matplotlib object-oriented, plt.subplots() |

.add_subplot()에 비해 훨씬 짧은 길이로 동일 결과물이 구현됩니다.- 코드가 짧으면 작성 시간 뿐 아니라 오류 가능성도 적어집니다.
4. Seaborn FacetGrid()
-
seaborn은 데이터 기반 subplots 제작기능을 탑재하고 있습니다.
FacetGrid()로 가로세로 공간을 만든 후.map()으로 데이터를 덮어 씌웁니다.- axes는
.axes속성으로, - figure는
.fig속성으로 접근합니다.
-
subplots의 column과 row를 정의할 데이터가 있어야 합니다.
- 적절한 feature가 있으면 편리하지만
- 그렇지 않다면 만들어 주어야 합니다.
-
FacetGrid()를 사용할 수 있도록 데이터를 수정합니다. -
12개월이 row순, column 순으로 놓일 수 있도록 준비합니다.
1 | # FacetGrid()를 사용하기 위한 데이터 수정 |

figure와axes를 동시에 생성합니다.
- 생성과 동시에 세부 설정을 완료합니다.
- 데이터를 매핑합니다.
axes를 추출합니다.
.ravel()명령으로 1D로 변환합니다.
for와enumerate로axes에 하나씩 접근합니다.
-
ax.명령을 이용해 tick, grid, xlabel, ylabel 설정을 완료합니다. -
코드는 다음과 같습니다.
1 | # FacetGrid()를 이용해 데이터 기반 subplots 생성 |

.add_subplot()과 유사한 길이의 코드로 구현됩니다.- 4가지 방법 전체 코드는 여기에서 다운로드 가능합니다.