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()
발표 자료를 만들 때는 talk나 poster 컨텍스트를 사용합니다. 슬라이드에서 텍스트가 멀리서도 잘 보이려면 글씨가 충분히 커야 합니다.
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() 한 번만 쓰면 이후 차트 전체에 적용되는 거고요."
"정확해. 이제 색상 팔레트를 골라야 해. 색도 그냥 예쁜 걸 쓰면 안 되고, 데이터의 성격에 맞는 걸 써야 해."