Skip to content
주제
Seaborn
Seaborn Barplot: The Complete Guide to Bar Charts in Python

Seaborn Barplot: Python 막대 그래프 완전 가이드

Updated on

카테고리 간 평균을 비교해야 합니다. 지역별 평균 매출, 교실별 평균 시험 점수, 서버별 중앙값 응답 시간일 수 있습니다. 원시 숫자 테이블은 행을 스캔하고 암산을 하도록 강요합니다. 잘 구성된 막대 그래프는 한눈에 답을 명확하게 보여줍니다 -- 그리고 Python의 seaborn 라이브러리를 사용하면 단 한 번의 함수 호출로 만들 수 있습니다.

문제는 sns.barplot()이 놀라울 정도로 깊은 매개변수 세트를 가지고 있다는 것입니다. hue를 사용한 그룹화, 오류 막대 제어, 카테고리 재정렬, 팔레트 선택, 수평 배치 -- 이 각각이 초보자와 한동안 함수를 사용하지 않은 경험 많은 사용자까지도 곤란하게 합니다. 잘못 구성된 막대 그래프는 독자를 오도하거나 단순히 보기 안 좋습니다.

이 가이드는 sns.barplot()의 모든 실용적인 사용 사례를 다룹니다. 모든 코드 블록은 복사하여 붙여넣기가 가능하고, 실제 또는 현실적인 데이터셋을 사용하며, 깔끔한 출력을 생성합니다. 끝까지 읽으면 출판 품질의 막대 그래프를 만드는 방법, barplotcountplot의 차이, PyGWalker를 사용한 대화형 탐색의 빠른 경로를 알게 될 것입니다.

📚

sns.barplot()이 하는 일

sns.barplot()은 각 막대의 높이(또는 길이)가 각 카테고리에 대한 수치 변수의 중심 경향을 나타내는 막대 그래프를 그립니다. 기본적으로 평균을 계산하고 각 막대 위에 95% 신뢰 구간을 오류 막대로 그립니다.

이것은 단순한 카운트 기반 막대 그래프와 다릅니다. 이것은 통계적 시각화입니다: 플로팅 전에 데이터를 집계합니다.

기본 구문

import seaborn as sns
import matplotlib.pyplot as plt
 
sns.barplot(data=df, x="category_column", y="numeric_column")
plt.show()

주요 매개변수 한눈에 보기:

매개변수목적기본값
data데이터를 포함하는 DataFrame필수
x / y카테고리 및 값 축의 열 이름필수
hue색상별 막대 그룹화를 위한 열None
estimator집계 함수 (평균, 중앙값, 합계 등)mean
errorbar오류 막대 유형 ("ci", "sd", "se", "pi" 또는 None)("ci", 95)
order명시적 카테고리 순서None (데이터 순서)
palette색상 구성None (seaborn 기본값)
orient막대 방향 ("v" 또는 "h")자동 감지
width각 막대의 너비0.8
saturation색상 채도 수준0.75
ax그릴 Matplotlib Axes현재 Axes

간단한 수직 막대 그래프

내장된 tips 데이터셋으로 시작합니다. 이 DataFrame은 레스토랑 계산서, 팁, 고객 속성을 기록합니다.

import seaborn as sns
import matplotlib.pyplot as plt
 
tips = sns.load_dataset("tips")
 
plt.figure(figsize=(8, 5))
sns.barplot(data=tips, x="day", y="total_bill")
plt.title("Average Total Bill by Day")
plt.ylabel("Average Total Bill ($)")
plt.xlabel("Day of Week")
plt.tight_layout()
plt.show()

각 막대는 해당 요일의 total_bill 평균을 보여줍니다. 위의 검은 선은 95% 신뢰 구간으로, 평균이 얼마나 변할 수 있는지를 보여줍니다. 목요일이 가장 낮은 평균 계산서를 가지며, 일요일이 더 높은 경향이 있습니다.

집계 함수를 변경하려면 estimator를 전달합니다:

import numpy as np
 
sns.barplot(data=tips, x="day", y="total_bill", estimator=np.median)
plt.title("Median Total Bill by Day")
plt.show()

수평 막대 그래프

카테고리 레이블이 길거나 카테고리가 많을 때 수평 막대가 더 잘 작동합니다. 수평 barplot을 만드는 두 가지 방법이 있습니다.

옵션 1: x와 y를 교환합니다.

plt.figure(figsize=(8, 5))
sns.barplot(data=tips, x="total_bill", y="day")
plt.title("Average Total Bill by Day (Horizontal)")
plt.xlabel("Average Total Bill ($)")
plt.ylabel("")
plt.tight_layout()
plt.show()

수치 열이 x에, 범주형 열이 y에 있으면 seaborn이 자동으로 수평 막대를 그립니다.

옵션 2: orient 매개변수를 사용합니다.

sns.barplot(data=tips, x="total_bill", y="day", orient="h")
plt.show()

두 접근 방식 모두 같은 결과를 생성합니다. xy를 교환하는 것이 더 일반적인 패턴입니다.

그룹화(Hue) 막대 그래프

hue 매개변수는 두 번째 범주형 변수를 기반으로 각 카테고리 막대를 하위 막대로 분할합니다. 하위 그룹을 나란히 비교하는 데 필수적입니다.

plt.figure(figsize=(9, 5))
sns.barplot(data=tips, x="day", y="total_bill", hue="sex")
plt.title("Average Total Bill by Day and Gender")
plt.ylabel("Average Total Bill ($)")
plt.legend(title="Gender")
plt.tight_layout()
plt.show()

이제 각 요일에 두 개의 막대가 표시됩니다 -- 하나는 남성, 하나는 여성입니다. 범례는 색상을 그룹에 매핑합니다. 대부분의 날에 남성 고객이 약간 더 높은 평균 계산서를 가지는 경향이 있다는 것을 즉시 알 수 있습니다.

hue 레벨이 3개 이상이면 막대가 좁아집니다. 가독성이 떨어지면 sns.catplot()을 사용한 패싯 접근 방식을 고려하세요:

g = sns.catplot(data=tips, x="day", y="total_bill", hue="sex",
                col="time", kind="bar", height=4, aspect=1.2)
g.set_axis_labels("Day", "Average Total Bill ($)")
g.set_titles("{col_name}")
plt.tight_layout()
plt.show()

이것은 점심과 저녁에 대한 별도의 패널을 만들며, 각각 성별로 그룹화된 막대가 있습니다 -- 여러 그룹화 차원이 있을 때 훨씬 읽기 쉽습니다.

팔레트로 색상 사용자 정의

palette 매개변수는 색상 구성을 제어합니다. Seaborn에는 많은 내장 팔레트가 포함되어 있습니다.

plt.figure(figsize=(8, 5))
sns.barplot(data=tips, x="day", y="total_bill", hue="sex",
            palette="Set2")
plt.title("Custom Palette: Set2")
plt.tight_layout()
plt.show()

인기 있는 팔레트 선택:

팔레트스타일최적 용도
"Set2"차분하고 구분되는범주형 비교
"pastel"부드러운 톤프레젠테이션, 밝은 배경
"deep"풍부하고 포화된기본 seaborn 외관
"viridis"지각적으로 균일한접근성 친화적
"coolwarm"발산형 파랑-빨강두 그룹 대비
"husl"균등 간격 색조많은 카테고리

특정 16진수 색상 목록을 전달할 수도 있습니다:

sns.barplot(data=tips, x="day", y="total_bill",
            palette=["#2ecc71", "#e74c3c", "#3498db", "#f39c12"])
plt.show()

또는 딕셔너리를 사용하여 특정 카테고리를 색상에 매핑합니다:

day_colors = {"Thur": "#636e72", "Fri": "#e17055",
              "Sat": "#0984e3", "Sun": "#6c5ce7"}
sns.barplot(data=tips, x="day", y="total_bill", palette=day_colors)
plt.show()

오류 막대와 신뢰 구간

기본적으로 sns.barplot()은 95% 신뢰 구간을 표시합니다. 이것은 평균 주위의 부트스트랩된 CI입니다. 표시되는 내용을 완전히 제어할 수 있습니다.

import matplotlib.pyplot as plt
import seaborn as sns
 
tips = sns.load_dataset("tips")
 
fig, axes = plt.subplots(1, 4, figsize=(18, 4), sharey=True)
 
# 95% CI (default)
sns.barplot(data=tips, x="day", y="total_bill", errorbar=("ci", 95), ax=axes[0])
axes[0].set_title("95% CI (default)")
 
# Standard deviation
sns.barplot(data=tips, x="day", y="total_bill", errorbar="sd", ax=axes[1])
axes[1].set_title("Standard Deviation")
 
# Standard error
sns.barplot(data=tips, x="day", y="total_bill", errorbar="se", ax=axes[2])
axes[2].set_title("Standard Error")
 
# No error bars
sns.barplot(data=tips, x="day", y="total_bill", errorbar=None, ax=axes[3])
axes[3].set_title("No Error Bars")
 
plt.tight_layout()
plt.show()
errorbar 값표시 내용사용 시기
("ci", 95)95% 부트스트랩 신뢰 구간기본값; 통계적 추론에 적합
"sd"표준 편차추정 불확실성이 아닌 데이터 분산 표시
"se"평균의 표준 오류과학 논문에서 일반적
("pi", 95)95% 백분위 구간관측값의 95%를 포함하는 범위 표시
None오류 막대 없음불확실성이 초점이 아닐 때의 깔끔한 시각화

참고: seaborn의 이전 버전(0.12 이전)에서는 매개변수가 errorbar 대신 ci로 불렸습니다. 레거시 코드에서 ci=95를 보면 같은 기능을 합니다. 현대 seaborn은 더 많은 유연성을 위해 errorbar를 사용합니다.

막대 정렬

기본적으로 막대는 데이터에서 카테고리가 나타나는 순서로 표시됩니다. order 매개변수를 사용하여 명시적으로 제어합니다.

plt.figure(figsize=(8, 5))
sns.barplot(data=tips, x="day", y="total_bill",
            order=["Thur", "Fri", "Sat", "Sun"])
plt.title("Bars in Chronological Order")
plt.tight_layout()
plt.show()

막대를 값 순서로 정렬하려면(가장 큰 것부터) 먼저 평균을 계산합니다:

day_order = tips.groupby("day")["total_bill"].mean().sort_values(ascending=False).index
 
plt.figure(figsize=(8, 5))
sns.barplot(data=tips, x="day", y="total_bill", order=day_order)
plt.title("Days Ordered by Average Bill (Descending)")
plt.tight_layout()
plt.show()

이 패턴 -- 집계된 메트릭으로 정렬 -- 은 막대 그래프를 즉시 정보가 풍부하게 만드는 가장 일반적인 방법 중 하나입니다.

sns.barplot() vs sns.countplot() -- 언제 무엇을 사용할까

이 두 함수는 비슷해 보이지만 다른 목적을 가지고 있습니다. 잘못된 것을 선택하는 것은 흔한 혼란의 원인입니다.

특징sns.barplot()sns.countplot()
플로팅 대상카테고리별 수치 변수의 집계 메트릭 (평균, 중앙값, 합계)카테고리별 관측 수
수치 y가 필요한가?아니오 (범주형 변수만)
기본 통계평균카운트
오류 막대예 (기본적으로 신뢰 구간)아니오
사용 사례"요일별 평균 팁은?""각 요일에 몇 끼가 제공되었나?"
구문sns.barplot(x="day", y="tip", data=tips)sns.countplot(x="day", data=tips)
동등한 것df.groupby("day")["tip"].mean()의 막대 그래프df["day"].value_counts()의 막대 그래프

경험 법칙: 집계하려는 수치 열이 있으면 barplot을 사용합니다. 각 카테고리에 몇 개의 행이 해당하는지 세고 싶을 뿐이라면 countplot을 사용합니다.

fig, axes = plt.subplots(1, 2, figsize=(14, 5))
 
# barplot: average tip per day
sns.barplot(data=tips, x="day", y="tip", ax=axes[0])
axes[0].set_title("sns.barplot() -- Average Tip by Day")
axes[0].set_ylabel("Average Tip ($)")
 
# countplot: number of records per day
sns.countplot(data=tips, x="day", ax=axes[1])
axes[1].set_title("sns.countplot() -- Meals per Day")
axes[1].set_ylabel("Count")
 
plt.tight_layout()
plt.show()

Matplotlib으로 사용자 정의

seaborn은 matplotlib 위에 구축되므로 matplotlib의 사용자 정의 레이어에 완전히 접근할 수 있습니다. 제목 추가, 레이블 회전, 폰트 조정, 막대 주석 달기 방법입니다.

제목, 레이블, 회전

plt.figure(figsize=(8, 5))
ax = sns.barplot(data=tips, x="day", y="total_bill", palette="muted")
 
ax.set_title("Average Total Bill by Day", fontsize=16, fontweight="bold")
ax.set_xlabel("Day of the Week", fontsize=12)
ax.set_ylabel("Average Bill ($)", fontsize=12)
ax.tick_params(axis='x', rotation=45)
 
plt.tight_layout()
plt.show()

막대에 값 레이블 추가

plt.figure(figsize=(8, 5))
ax = sns.barplot(data=tips, x="day", y="total_bill", errorbar=None,
                 palette="Blues_d",
                 order=["Thur", "Fri", "Sat", "Sun"])
 
# Annotate each bar with its value
for container in ax.containers:
    ax.bar_label(container, fmt="%.1f", fontsize=11, padding=3)
 
ax.set_title("Average Total Bill by Day")
ax.set_ylabel("Average Bill ($)")
ax.set_ylim(0, 25)
plt.tight_layout()
plt.show()

ax.bar_label() 메서드(matplotlib 3.4에서 추가)는 값 주석을 추가하는 가장 깔끔한 방법입니다. padding 인수는 막대 상단으로부터의 거리를 제어합니다.

누적 막대 (대안)

Seaborn은 기본적으로 누적 막대 그래프를 지원하지 않습니다. 이것은 의도적인 설계 결정입니다 -- 누적 막대는 개별 세그먼트 크기를 비교하기 어렵게 만듭니다. 그러나 사용 사례에 필요한 경우 pandas 플로팅이나 수동 matplotlib 접근 방식으로 효과를 달성할 수 있습니다.

Pandas .plot(kind="bar", stacked=True) 사용

import pandas as pd
import matplotlib.pyplot as plt
 
tips = pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv")
 
# Pivot to get counts per day and time
pivot = tips.groupby(["day", "time"]).size().unstack(fill_value=0)
 
# Reorder days
pivot = pivot.loc[["Thur", "Fri", "Sat", "Sun"]]
 
pivot.plot(kind="bar", stacked=True, figsize=(8, 5),
           color=["#3498db", "#e74c3c"], edgecolor="white")
plt.title("Meal Count by Day (Stacked by Lunch/Dinner)")
plt.ylabel("Number of Meals")
plt.xlabel("Day")
plt.xticks(rotation=0)
plt.legend(title="Time")
plt.tight_layout()
plt.show()

Matplotlib으로 수동 누적

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
tips = sns.load_dataset("tips")
pivot = tips.groupby(["day", "time"])["total_bill"].mean().unstack(fill_value=0)
pivot = pivot.loc[["Thur", "Fri", "Sat", "Sun"]]
 
days = pivot.index
lunch = pivot["Lunch"].values
dinner = pivot["Dinner"].values
 
x = np.arange(len(days))
width = 0.6
 
fig, ax = plt.subplots(figsize=(8, 5))
ax.bar(x, lunch, width, label="Lunch", color="#3498db")
ax.bar(x, dinner, width, bottom=lunch, label="Dinner", color="#e74c3c")
 
ax.set_xticks(x)
ax.set_xticklabels(days)
ax.set_ylabel("Average Total Bill ($)")
ax.set_title("Average Bill by Day (Stacked: Lunch + Dinner)")
ax.legend()
plt.tight_layout()
plt.show()

두 접근 방식 모두 작동합니다. pandas 방법이 더 간결합니다. matplotlib 방법은 위치 지정과 스타일링에 더 많은 제어를 제공합니다.

PyGWalker로 대화형 막대 그래프 만들기

정적 막대 그래프는 보고서와 논문에 적합합니다. 하지만 탐색적 분석 중에는 축을 변경하고, 다른 집계를 시도하고, 데이터를 필터링하고, 차트 유형을 비교하고 싶을 때가 많습니다 -- 매번 코드를 다시 작성하지 않고도.

PyGWalker (opens in a new tab)(Graphic Walker의 Python 바인딩)는 모든 pandas DataFrame을 Jupyter Notebook 내에서 직접 대화형 Tableau와 유사한 시각화 인터페이스로 변환합니다. 필드를 드래그 앤 드롭하여 막대 그래프, 그룹화된 막대 그래프, 수십 가지 다른 차트 유형을 구축할 수 있습니다.

pip install pygwalker
import pandas as pd
import pygwalker as pyg
 
tips = pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv")
walker = pyg.walk(tips)

인터페이스가 로드되면 다음을 할 수 있습니다:

  • day를 X축으로, total_bill을 Y축으로 드래그하여 즉시 막대 그래프를 만듭니다.
  • sex 또는 time을 색상 채널에 드롭하여 그룹화된 막대 그래프를 얻습니다.
  • 한 번의 클릭으로 집계를 평균에서 합계, 중앙값, 또는 카운트로 변경합니다.
  • pandas 코드를 작성하지 않고 필터를 적용합니다(예: 토요일과 일요일만).
  • 재현성을 위해 차트 구성을 내보냅니다.

이것은 탐색 단계에서 특히 유용합니다 -- 어떤 그룹화와 집계가 가장 많은 인사이트를 제공하는지 빠르게 테스트한 다음, 공유를 위해 sns.barplot()으로 최종 정적 시각화를 확정합니다.

자주 묻는 질문

sns.barplot()에서 개별 막대의 색상을 변경하려면?

palette 매개변수에 색상 목록을 전달합니다. 목록 길이는 카테고리 수와 일치해야 합니다. 예: sns.barplot(data=tips, x="day", y="total_bill", palette=["#e74c3c", "#3498db", "#2ecc71", "#f39c12"]). 명시적 제어를 위해 카테고리 이름을 색상에 매핑하는 딕셔너리를 전달할 수도 있습니다.

sns.barplot()과 plt.bar()의 차이점은?

sns.barplot()은 DataFrame과 직접 작동하며, 집계 통계(기본값: 평균)를 자동으로 계산하고 신뢰 구간을 그립니다. matplotlib의 plt.bar()는 미리 계산된 막대 높이와 위치가 필요합니다 -- 집계 없이 주어진 것을 정확히 그립니다. 빠른 통계 요약에는 sns.barplot()을, 완전한 수동 제어에는 plt.bar()를 사용하세요.

seaborn barplot에서 오류 막대를 제거하려면?

함수 호출에서 errorbar=None을 설정합니다: sns.barplot(data=tips, x="day", y="total_bill", errorbar=None). seaborn 0.12 이전 버전에서는 대신 ci=None을 사용합니다.

sns.barplot()이 평균 대신 합계를 표시할 수 있나요?

네. 함수에 estimator=sum을 전달합니다: sns.barplot(data=tips, x="day", y="total_bill", estimator=sum). 배열을 받아 스칼라를 반환하는 모든 함수를 사용할 수 있으며, numpy.median, numpy.std, 또는 사용자 정의 람다를 포함합니다.

seaborn에서 수평 barplot을 만드는 방법은?

수치 열을 x 축에, 범주형 열을 y에 놓습니다: sns.barplot(data=tips, x="total_bill", y="day"). Seaborn은 자동으로 방향을 감지합니다. orient="h"를 명시적으로 설정할 수도 있습니다.

결론

seaborn barplot은 Python에서 카테고리 간 집계된 메트릭을 시각화하는 가장 빠른 방법입니다. 신뢰 구간이 있는 평균값을 보여주는 한 줄부터, hue를 사용한 그룹 비교, 값 주석이 있는 완전히 스타일된 차트까지 -- sns.barplot()은 막대 그래프 필요의 전체 범위를 다룹니다.

간단하게 시작하세요: DataFrame을 전달하고, x와 y 열을 선택하고, seaborn이 집계와 스타일링을 처리하게 합니다. 그런 다음 필요에 따라 사용자 정의를 추가합니다 -- 값으로 막대를 정렬하거나, 긴 레이블을 위해 수평 레이아웃으로 전환하거나, 더 깔끔한 프레젠테이션 슬라이드를 위해 오류 막대를 끕니다.

누적 막대가 필요하면 pandas나 matplotlib을 직접 사용하세요. 특정 차트 구성을 확정하기 전에 데이터를 대화형으로 탐색하고 싶다면 PyGWalker (opens in a new tab)가 추가 코드 없이 Jupyter 내에서 작동하는 드래그 앤 드롭 인터페이스를 제공합니다.

이 가이드의 모든 코드 예제는 복사하여 실행할 준비가 되어 있습니다. 사용 사례에 가장 가까운 패턴을 선택하고, 데이터를 교체하면, 1분 이내에 명확하고 유익한 막대 그래프를 갖게 됩니다.

📚