iBetter Books
수정

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=...)로 크기를 미리 지정해도 반영되지 않습니다. 크기 조절은 heightaspect 파라미터를 사용합니다.

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()

실행 결과