Figure-level vs Axes-level 함수
민서가 Seaborn 문서를 훑어보다가 물었습니다. "scatterplot이랑 relplot이 있는데, 뭐가 달라요?"
선배가 화이트보드를 가리켰습니다. "그게 Seaborn에서 제일 중요한 구분 중 하나야. 앉아봐."
두 가지 레벨
Seaborn 함수는 두 가지 레벨로 나뉩니다.
Axes-level 함수는 Matplotlib의 Axes 객체 위에 그래프를 그립니다. 반환값이 matplotlib.axes.Axes입니다. 기존 subplot 구조에 자연스럽게 끼워 넣을 수 있습니다.
Figure-level 함수는 FacetGrid라는 Seaborn 전용 컨테이너를 만들고, 그 안에 그래프를 그립니다. 반환값이 seaborn.FacetGrid입니다. col, row 파라미터로 데이터를 조건별로 분할하여 여러 패널을 자동으로 생성할 수 있습니다.
함수 목록
| 카테고리 | Axes-level 함수 | Figure-level 함수 |
|---|---|---|
| 관계형 | scatterplot, lineplot | relplot |
| 분포형 | histplot, kdeplot, ecdfplot, rugplot | displot |
| 범주형 | stripplot, swarmplot, boxplot, violinplot, pointplot, barplot | catplot |
| 회귀 | regplot | lmplot |
반환 타입 비교
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")# Axes-level: matplotlib.axes.Axes 반환ax = sns.scatterplot(data=tips, x="total_bill", y="tip")print(type(ax))plt.show()
<class 'matplotlib.axes.Axes'>
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")# Figure-level: seaborn.FacetGrid 반환g = sns.relplot(data=tips, x="total_bill", y="tip")print(type(g))plt.show()
<class 'seaborn.axisgrid.FacetGrid'>
Figure-level 함수의 강점: col과 row
Figure-level 함수의 진가는 col, row 파라미터에 있습니다. 카테고리별로 패널을 자동으로 나눠줍니다.
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")# time(Lunch/Dinner) 기준으로 패널 분할g = sns.relplot( data=tips, x="total_bill", y="tip", col="time")plt.show()
이 한 줄로 Lunch 패널과 Dinner 패널이 나란히 생성됩니다. Matplotlib으로 같은 결과를 내려면 subplot을 만들고, 데이터를 필터링하고, 각 subplot에 따로 그려야 합니다.
어떤 것을 써야 하는가
선배가 정리해줬습니다.
"처음엔 Axes-level로 시작해. scatterplot, lineplot, boxplot 같은 거. plt.subplots()랑 조합이 쉽고, 기존 Matplotlib 코드에 끼워 넣기도 편해."
"데이터를 조건별로 나눠서 비교하고 싶을 때, 그때 Figure-level을 써. relplot, catplot처럼 col이나 row를 줄 수 있는 것들."
| 상황 | 추천 |
|---|---|
| 단일 차트 | Axes-level |
| 기존 plt.subplots()와 조합 | Axes-level |
| 조건별 패널 분할 필요 | Figure-level |
| FacetGrid 기능 필요 | Figure-level |
주의점: Figure-level 함수와 plt 함수
Figure-level 함수는 자체적으로 Figure를 생성합니다. plt.figure(figsize=...)로 크기를 미리 지정해도 반영되지 않습니다. 크기 조절은 height와 aspect 파라미터를 사용합니다.
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")# Figure-level 함수에서 크기 조절g = sns.relplot( data=tips, x="total_bill", y="tip", col="time", height=4, aspect=1.2)plt.show()