본문 바로가기
데이터 분석/시각화

[Seaborn] 2. 막대 그래프(바 차트, Bar Chart) 그리기 (feat. barplot)

by 부자 꽁냥이 2022. 8. 6.

반갑습니다~ 오늘도 꽁냥이 인사드립니다. 오늘은 Seaborn의 barplot을 이용하여 막대 그래프(바 차트, Bar Chart) 그리는 방법에 대해서 알아보겠습니다.

 

- 목차 -

1. Seaborn barplot 기본

2. Seaborn barplot 다양한 기능들

 

Matplotlib을 이용한 막대 그래프 그리는 방법은 아래에 포스팅해 두었으니 참고하시면 됩니다.

 

[바 차트(Bar chart)] 1. Matplotlib을 이용하여 바 차트, 수평 바 차트 그리기

[바 차트(Bar chart)] 2. Matplotlib을 이용하여 바 차트 꾸미기

[바 차트(Bar chart)] 3. Matplotlib 바 차트 번외 - 막대에 그라데이션 적용하기

[바 차트(Bar chart)] 4. Matplotlib을 이용하여 그룹 바 차트(Grouped bar chart) 그리기

[바 차트(Bar chart)] 5. Matplotlib을 이용하여 스택 바 차트(Stacked bar chart) 그리기


   1. Seaborn barplot 기본

barplot의 기본적인 사용법은 다음과 같습니다. x인자에는 x축에 표시할 범주형 변수의 배열, y인자에는 각 범주에 해당하는 통계값 배열이 들어가면 되지요. 아래 코드를 통해 barplot의 기본 사용법을 이해할 수 있습니다.

 

import seaborn as sns

sns.set_theme(style="whitegrid") ## figure, axes 스타일
x = ['A', 'B', 'C', 'D'] ## x축에 들어갈 범주형 변수
y = [12, 13, 6, 11] ## 각 범주에 해당하는 숫자
sns.barplot(x=x, y=y) ## 바 차트 생성

seaborn barplot 기본


   2. Seaborn barplot 다양한 기능들

1) Pandas 데이터프레임 지원

seaborn은 Pandas 데이터프레임으로 이루어진 데이터 시각화를 지원하는데요. Seaborn에서 제공하는 Tip 데이터를 이용하여 막대 그래프(바 차트, Bar Chart)를 그려보겠습니다.

 

먼저 Tip 데이터를 불러옵니다.

 

tip_df = sns.load_dataset("tips")
tip_df.head()

 

 

꽁냥이는 요일별 평균 total_bill 값을 막대 그래프로 그릴 거예요. data인자에 Tip 데이터를 담고 있는 데이터프레임을 넣어주고요. x축엔 요일을 나타내는 칼럼 이름 'day', 그리고 y엔 'total_bill'을 넣어줍니다.

 

sns.set_theme(style="whitegrid") ## figure, axes 스타일
sns.barplot(x="day", y="total_bill", data=tip_df)

 

보시는 바와 같이 막대 그래프가 잘 생성되었습니다. 막대의 높이는 요일별 평균 total_bill이며 요일별 total_bill의 분포를 이용하여 error line(검정색 실선)을 그려줍니다. 만약 error line을 없애고 싶으면 다음과 같이 errwidth=0으로 지정해주세요.

 

sns.set_theme(style="whitegrid") ## figure, axes 스타일
sns.barplot(x="day", y="total_bill", data=tip_df, errwidth=0)

 


2) 수평 막대 그래프

barplot은 기본적으로 수직 막대 그래프를 그립니다. 만약 수평으로 그리고 싶다면 orient='h'로 지정해주세요. 이때 주의할 점은 y축에 범주형 변수를 나타내는 칼럼, x축에 수치형 칼럼을 넣어줘야 된다는 것입니다.

 

sns.set_theme(style="whitegrid") ## figure, axes 스타일
sns.barplot(x="total_bill", y="day", data=tip_df, orient='h')

 


3) 막대 색상 변경

막대 색상은 palette 인자를 통해 변경할 수 있습니다. 아래 코드는 Seaborn에서 제공하는 color_palette를 통하여 컬러맵을 만들고 이를 palette인자에 넣어준 것입니다.

 

cm = sns.color_palette('hls', len(tip_df['day'].unique()))
    
sns.set_theme(style="whitegrid") ## figure, axes 스타일
sns.barplot(x="day", y="total_bill", data=tip_df, palette=cm)

 

이 밖에도 Matplotlib에서 제공하는 컬러맵도 사용할 수 있습니다. 사용법은 palette인자에 문자열을 넣어주면 됩니다. Matplotlib에서 제공하는 컬러맵이 궁금하신 분들은 여기를 참고해주세요.

 

sns.barplot(x="day", y="total_bill", data=tip_df, palette='seismic')

 


4) 막대 폭 변경하기

Seaborn에서 막대의 폭을 변경하는 직접적인 방법은 안타깝게도 없습니다. 문서 상에는 Matplotlib의 bar 함수의 인자를 지원한다고 해서 width인자를 써봤더니 에러가 났습니다.

 

그렇다면 방법은 없는 것이냐?

→ 있습니다.

 

기존 막대 좌측 x좌표와 기존 막대 폭 그리고 새로 바꿀 폭을 이용하여 바꿀 수 있습니다. 아래 코드는 폭을 0.5로 바꾼 것입니다. width 값은 0~1 사이의 숫자만 가능합니다.

 

sns.set_theme(style="whitegrid") ## figure, axes 스타일
width = 0.5
ax = sns.barplot(x="day", y="total_bill", data=tip_df)

for bar in ax.patches:
    x = bar.get_x() # 막대 좌측 하단 x 좌표
    old_width = bar.get_width() # 기존 막대 폭
    bar.set_width(width) # 폭변경
    bar.set_x(x+(old_width-width)/2) # 막대 좌측 하단 x 좌표 업데이트

 

폭이 변경된 막대 그래프


5) 그룹 막대 그래프 그리기

hue를 사용하면 그룹 막대 그래프를 그릴 수 있습니다. 아래 코드는 일별 평균 total_bill을 성별로 한번 더 세분화한 그룹 막대 그래프를 그리는 코드입니다.

 

sns.barplot(x="day", y="total_bill", data=tip_df, hue='sex')

 


6) 원하는 통계값 적용하기

barplot은 기본적으로 각 범주에 대응하는 수치형 데이터가 2개 이상이라면 평균을 막대 그래프로 그려줍니다. 이때 평균 말고 다른 통계값을 쓰고 싶을 때에는 estimator 인자에 통계값을 계산하는 함수를 넣어주면 됩니다. 아래는 평균, 중앙값, 최대값, 최소값을 적용하여 막대 그래프를 그리는 코드입니다.

 

import matplotlib.pyplot as plt
import numpy as np
estimators = [(np.mean, 'Mean'), ## 평균
              (np.median, 'Median'), ## 중앙값
              (np.max, 'Max'), ## 최대값
              (np.min, 'Min') ## 최소값
             ]
sns.set_theme(style="whitegrid") ## figure, axes 스타일
fig, ax = plt.subplots(2, 2)
fig.set_size_inches((10,10))
fig.set_facecolor('white')
for i, e in enumerate(estimators):
    estimator = e[0]
    title = e[1]
    row = i//2
    col = i%2
    cur_ax = ax[row, col]
    sns.barplot(x="day", y="total_bill", data=tip_df, hue='sex', estimator=estimator,
                ax=cur_ax, ## 현재 axes에 그려짐
                errwidth=0
               )
    cur_ax.set_title(title)

 


오늘은 Seaborn에서 막대 그래프를 그리는 방법에 대해서 알아보았습니다. 부디 도움이 되셨으면 좋겠어요. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다.

 


댓글


맨 위로