iBetter Books
수정

set_theme과 내장 스타일

Seaborn은 기본 설정 그대로도 Matplotlib보다 보기 좋은 차트를 만들지만, 테마를 바꾸면 훨씬 더 전문적으로 보입니다.

sns.set_theme()은 이후에 그려지는 모든 차트에 일괄 스타일을 적용하는 전역 설정 함수입니다. 코드 맨 위에 한 번 호출해두면 됩니다.


set_theme의 기본 사용법

# 파일: set_theme_basic.pyimport seaborn as snsimport matplotlib.pyplot as plt# 전역 테마 설정sns.set_theme(style="whitegrid", palette="deep", font_scale=1.2)tips = sns.load_dataset("tips")sns.boxplot(data=tips, x="day", y="total_bill")plt.title("요일별 총 금액")plt.show()

실행 결과

style은 배경과 격자선, palette는 기본 색상, font_scale은 모든 글씨의 크기 배율입니다.


5가지 내장 스타일

Seaborn은 다섯 가지 내장 스타일을 제공합니다. 같은 차트에 적용해서 비교해봅니다.

# 파일: styles_compare.pyimport seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")styles = ["darkgrid", "whitegrid", "dark", "white", "ticks"]fig, axes = plt.subplots(1, 5, figsize=(20, 4))for ax, style in zip(axes, styles):    with sns.axes_style(style):        sns.boxplot(            data=tips,            x="day",            y="total_bill",            ax=ax        )    ax.set_title(style)    ax.set_xlabel("")    ax.set_ylabel("")plt.suptitle("5가지 Seaborn 스타일 비교", y=1.02)plt.tight_layout()plt.show()

실행 결과

각 스타일의 특징입니다.

스타일 특징 언제 쓰나
darkgrid 회색 배경 + 격자선 (기본값) 일반 탐색
whitegrid 흰 배경 + 격자선 논문, 보고서
dark 회색 배경, 격자선 없음 색상 강조
white 흰 배경, 격자선 없음 미니멀 디자인
ticks 흰 배경 + 축 눈금 인쇄물, 학술 발표

axes_style: 일부 차트에만 스타일 적용하기

sns.set_theme()은 이후 모든 차트에 영향을 미칩니다. 특정 차트에만 다른 스타일을 적용하고 싶다면 axes_style()을 컨텍스트 매니저로 사용합니다.

# 파일: axes_style_context.pyimport seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")# 전역 설정: whitegridsns.set_theme(style="whitegrid")fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))# 첫 번째 차트: 전역 설정(whitegrid) 그대로sns.boxplot(data=tips, x="day", y="total_bill", ax=ax1)ax1.set_title("whitegrid (전역 설정)")# 두 번째 차트: dark 스타일로 일시 변경with sns.axes_style("dark"):    sns.boxplot(data=tips, x="day", y="total_bill", ax=ax2)ax2.set_title("dark (일시 변경)")plt.tight_layout()plt.show()

실행 결과

with 블록이 끝나면 전역 설정으로 돌아옵니다.


plotting_context: 용도에 맞는 크기 조절

스타일이 배경과 격자선을 담당한다면, 컨텍스트는 글씨 크기, 선 굵기, 마커 크기 등 요소의 크기를 담당합니다.

Seaborn은 네 가지 컨텍스트를 제공합니다.

컨텍스트 용도 글씨 크기
paper 논문 그림 (작게) 가장 작음
notebook 주피터 노트북 (기본값) 보통
talk 강의·세미나 발표
poster 학술 포스터 가장 큼
# 파일: plotting_context_compare.pyimport seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")contexts = ["paper", "notebook", "talk", "poster"]fig, axes = plt.subplots(1, 4, figsize=(24, 5))for ax, ctx in zip(axes, contexts):    with sns.plotting_context(ctx):        sns.barplot(            data=tips,            x="day",            y="total_bill",            ax=ax        )    ax.set_title(f"context: {ctx}")    ax.set_xlabel("")    ax.set_ylabel("")plt.suptitle("4가지 plotting_context 비교", y=1.02)plt.tight_layout()plt.show()

실행 결과

발표 자료를 만들 때는 talkposter 컨텍스트를 사용합니다. 슬라이드에서 텍스트가 멀리서도 잘 보이려면 글씨가 충분히 커야 합니다.


font_scale로 글씨 크기 세밀 조정

컨텍스트보다 더 세밀하게 크기를 조절하고 싶을 때 font_scale을 사용합니다.

# 파일: font_scale.pyimport seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")# talk 컨텍스트에 font_scale=1.5 적용sns.set_theme(style="whitegrid", context="talk", font_scale=1.5)sns.barplot(data=tips, x="day", y="total_bill")plt.title("요일별 평균 금액")plt.xlabel("요일")plt.ylabel("평균 금액 ($)")plt.show()

실행 결과

font_scale=1.0이 기본값입니다. 1.5이면 모든 텍스트가 기본의 1.5배 크기가 됩니다.


set_theme에서 style과 context 함께 설정하기

# 파일: set_theme_full.pyimport seaborn as snsimport matplotlib.pyplot as plt# 발표용 설정: 흰 배경, 큰 글씨, 중립적 색상sns.set_theme(    style="ticks",    context="talk",    palette="colorblind",    font="sans-serif",    font_scale=1.2)tips = sns.load_dataset("tips")g = sns.relplot(    data=tips,    x="total_bill",    y="tip",    hue="time",    col="smoker")g.set_axis_labels("총 금액 ($)", "팁 ($)")g.set_titles("{col_name}")plt.show()

실행 결과

이 설정은 발표 슬라이드에 넣을 차트로 적합합니다. 흰 배경은 빔 프로젝터에서 선명하게 보이고, ticks 스타일은 불필요한 격자선이 없어 깔끔합니다.


설정 초기화하기

테마 설정을 모두 초기화하고 Matplotlib 기본값으로 되돌리려면 sns.reset_defaults()를 사용합니다.

# 파일: reset_theme.pyimport seaborn as snsimport matplotlib.pyplot as pltsns.set_theme(style="dark", font_scale=2.0)tips = sns.load_dataset("tips")# 설정 초기화sns.reset_defaults()# 이후 차트는 Matplotlib 기본 스타일로 그려집니다sns.boxplot(data=tips, x="day", y="total_bill")plt.show()

실행 결과


민서의 정리

"발표할 때는 ticks 스타일에 talk 컨텍스트 쓰면 되겠네요. 그리고 코드 맨 위에 sns.set_theme() 한 번만 쓰면 이후 차트 전체에 적용되는 거고요."

"정확해. 이제 색상 팔레트를 골라야 해. 색도 그냥 예쁜 걸 쓰면 안 되고, 데이터의 성격에 맞는 걸 써야 해."