iBetter Books
수정

relplot으로 통합

민서는 식사 시간(점심/저녁)에 따라 계산 금액과 팁의 관계가 다른지 확인하고 싶었습니다. 두 차트를 나란히 보면 한눈에 비교할 수 있을 것 같았습니다.

강주원 선배가 말했습니다.

"그럴 때 relplot을 쓰면 돼. col 파라미터 하나로 자동으로 나눠줘."

relplot이란

relplot은 Figure-level 함수입니다. scatterplotlineplot을 내부적으로 사용하면서, col이나 row 파라미터로 차트를 격자 형태로 분할할 수 있습니다.

scatterplot이나 lineplot은 이미 존재하는 Axes 하나에 그리지만, relplot은 필요한 만큼 Axes를 만들어 Figure 전체를 관리합니다.

산점도를 열로 분할하기

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")g = sns.relplot(    data=tips,    x="total_bill",    y="tip",    hue="smoker",    col="time",        # 식사 시간(Lunch/Dinner)으로 열 분할    kind="scatter"     # scatterplot 사용)g.set_titles("식사 시간: {col_name}")plt.show()

실행 결과

kind="scatter"가 기본값이므로 생략해도 됩니다. col="time"time 컬럼의 고유값 수만큼 열을 자동으로 만듭니다.

행과 열로 동시에 분할하기

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")g = sns.relplot(    data=tips,    x="total_bill",    y="tip",    hue="smoker",    col="time",    row="sex",         # 성별로 행 분할    kind="scatter",    height=4,    aspect=1.2)plt.show()

실행 결과

colrow를 함께 쓰면 2×2 격자가 만들어집니다. height는 각 서브플롯의 높이(인치), aspect는 가로/세로 비율입니다.

선 그래프로 전환하기

kind="line"으로 바꾸면 내부적으로 lineplot을 사용합니다.

import seaborn as snsimport matplotlib.pyplot as pltfmri = sns.load_dataset("fmri")g = sns.relplot(    data=fmri,    x="timepoint",    y="signal",    hue="event",    col="region",      # 뇌 영역별로 열 분할    kind="line",    height=4,    aspect=1.3)g.set_titles("{col_name} 영역")g.set_axis_labels("시간", "신호 강도")plt.show()

실행 결과

Axes-level 함수와의 차이

항목 scatterplot / lineplot relplot
레벨 Axes-level Figure-level
반환값 Axes 객체 FacetGrid 객체
col/row 분할 불가 가능
ax 파라미터 사용 가능 사용 불가
plt.subplots()와 함께 사용 별도로 Figure 생성

relplot이 반환하는 FacetGrid 객체는 g.set_titles(), g.set_axis_labels(), g.fig 등 다양한 메서드를 제공합니다.

제목과 축 레이블 설정

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")g = sns.relplot(    data=tips,    x="total_bill",    y="tip",    hue="smoker",    col="day",    col_wrap=2,        # 한 행에 최대 2개 열    kind="scatter",    height=3.5)g.set_titles("요일: {col_name}")g.set_axis_labels("계산 금액 (달러)", "팁 (달러)")g.fig.suptitle("요일별 계산 금액과 팁", y=1.03, fontsize=14)plt.show()

실행 결과

col_wrap=2는 열이 4개(day의 고유값이 4개)일 때 한 행에 2개씩 배치해서 2×2 격자로 만듭니다. col만 쓸 때 유용합니다.