Matplotlib과의 관계
"Seaborn 쓰면 Matplotlib은 더 이상 안 써도 되는 거예요?"
민서의 질문에 선배가 웃었습니다. "아니, 같이 써야 해. Seaborn이 Matplotlib 위에서 동작하거든. 하나가 다른 하나를 대체하는 게 아니야."
Seaborn은 Matplotlib의 확장
Seaborn은 독립적인 라이브러리가 아닙니다. 내부적으로 Matplotlib을 사용하여 그래프를 그리는 고수준 API입니다. Seaborn 함수를 호출하면 결국 Matplotlib의 Axes와 Figure가 만들어집니다.
이 구조 덕분에 Seaborn으로 기본 그래프를 빠르게 그리고, Matplotlib으로 세부 사항을 다듬는 방식이 자연스럽게 가능합니다.
Axes 객체를 받아서 꾸미기
Axes-level 함수는 matplotlib.axes.Axes 객체를 반환합니다. 이 객체에 Matplotlib 메서드를 그대로 사용할 수 있습니다.
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")# scatterplot이 Axes를 반환ax = sns.scatterplot(data=tips, x="total_bill", y="tip")# Matplotlib 메서드로 꾸미기ax.set_title("계산서 금액과 팁의 관계")ax.set_xlabel("계산서 금액 (달러)")ax.set_ylabel("팁 (달러)")ax.set_xlim(0, 60)ax.set_ylim(0, 12)plt.tight_layout()plt.show()
ax.set_title(), ax.set_xlabel(), ax.set_xlim() 모두 Matplotlib 메서드입니다. Seaborn이 반환한 Axes 객체를 그대로 받아서 쓸 수 있습니다.
plt.subplots()와 조합하여 여러 차트 배치
여러 차트를 한 Figure에 배치하고 싶다면, plt.subplots()로 Axes 배열을 먼저 만들고 각 Axes에 Seaborn 그래프를 끼워 넣습니다.
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")# 1행 2열 subplot 생성fig, axes = plt.subplots(1, 2, figsize=(12, 5))# 왼쪽: 산점도sns.scatterplot(data=tips, x="total_bill", y="tip", ax=axes[0])axes[0].set_title("산점도")# 오른쪽: 박스플롯sns.boxplot(data=tips, x="day", y="total_bill", ax=axes[1])axes[1].set_title("요일별 계산서 금액")plt.tight_layout()plt.show()
ax=axes[0]처럼 ax 파라미터로 그릴 위치를 지정합니다. 모든 Axes-level Seaborn 함수가 ax 파라미터를 지원합니다.
비교: Matplotlib만 vs Seaborn+Matplotlib 조합
같은 결과물을 Matplotlib만으로 그릴 때와 조합으로 그릴 때를 비교합니다.
Matplotlib만 사용
import pandas as pdimport matplotlib.pyplot as plttips = pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv")fig, axes = plt.subplots(1, 2, figsize=(12, 5))# 왼쪽: 직접 scatteraxes[0].scatter(tips["total_bill"], tips["tip"], alpha=0.7)axes[0].set_xlabel("total_bill")axes[0].set_ylabel("tip")axes[0].set_title("산점도")# 오른쪽: 요일별 boxplot을 직접 그리려면 데이터 가공 필요days = ["Thur", "Fri", "Sat", "Sun"]data_by_day = [tips[tips["day"] == d]["total_bill"].values for d in days]axes[1].boxplot(data_by_day, labels=days)axes[1].set_xlabel("day")axes[1].set_ylabel("total_bill")axes[1].set_title("요일별 계산서 금액")plt.tight_layout()plt.show()
Seaborn + Matplotlib 조합
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")fig, axes = plt.subplots(1, 2, figsize=(12, 5))sns.scatterplot(data=tips, x="total_bill", y="tip", alpha=0.7, ax=axes[0])axes[0].set_title("산점도")sns.boxplot(data=tips, x="day", y="total_bill", ax=axes[1])axes[1].set_title("요일별 계산서 금액")plt.tight_layout()plt.show()
Matplotlib만 사용하면 범주형 데이터를 직접 그룹화해야 하지만, Seaborn은 컬럼 이름을 전달하면 알아서 처리합니다. 코드가 짧아질 뿐만 아니라, 실수할 여지도 줄어듭니다.
선배가 말했습니다. "Seaborn으로 빠르게 그리고, 세부 조정은 Matplotlib으로 하면 돼. 그게 실제로 데이터 분석 현장에서 가장 많이 쓰는 방식이야."