Bar Plot

홍찬우·2023년 7월 23일
0

Bar plot

막대 그래프
범주에 따른 수치 값을 비교하기에 적합


Multiple Bar Plot

plot을 여러 개 그리는 방법

Stacked Bar Plot

한 개의 플롯에 동시에 나타내는 방법
맨 밑의 bar 분포는 파악하기 쉽지만 위에 쌓여있는 bar의 분포는 어려움
.bar() 에선 bottom 파라미터, .barh() 에선 left 파라미터 이용
Percentage Stacked Bar Chart



Overlapped Bar Plot

두 그룹을 겹쳐서 비교
.bar() 에서 alpha 값으로 투명도를 설정해서 그림
세 개 이상의 그룹에선 비교가 힘듦


Grouped Bar Plot

비교적 구현이 까다로움



정확한 Bar Plot

실제 값과 그에 표현되는 그래픽으로 표현되는 잉크 양은 비례해야 함

  • 반드시 x축의 시작은 0

데이터 정렬하기

  • pandas의 sort_values(), sort_index() 사용
  • 시계열 - 시간순, 수치형 - 크기순, 순서형 - 범주 순서대로, 명목형 - 범주 값 따라 정렬

적절한 공간 활용

  • 여백과 공간을 조정해 가독성 높임
  • 막대의 두께 조정

복잡함 / 단순함

  • 무의미한 3D는 사용 금지
  • 직사각형이 아닌 다른 형태의 bar는 지양

그 외

  • 오차 막대 추가해 uncertainty 정보 제공 (errorbar)
  • histogram
  • 다양한 텍스트 정보 활용





실습

Basic

fig, axes = plt.subplots(1, 2, figsize=(12, 7))

  • axes[0], axes[1] 로 각 ax에 접근 가능

Multiple Bar Plot

  • ax에서 x축에는 index를, y축에는 해당 값을 넣어 bar plot 생성
  • y축의 scale이 다른 것을 확인


  • subplot에 sharey=True 를 이용해 y축 share


  • 또는 set_ylim() 을 이용해 y limit을 똑같이 고정


Stacked Bar Plot

.bar() 에서 bottom 을 사용해 male의 그래프를 밑에 쌓을 수 있음

  • bottom=group[’male’] 을 사용해 male의 bar plot을 female 밑에 쌓음


Percentage Stacked Bar Plot

fig, ax = plt.subplots(1, 1, figsize=(12, 7))
group = group.sort_index(ascending=False) # 역순 정렬
total=group['male']+group['female'] # 각 그룹별 합

ax.barh(group['male'].index, group['male']/total, 
        color='royalblue')

ax.barh(group['female'].index, group['female']/total, 
        left=group['male']/total, 
        color='tomato')

ax.set_xlim(0, 1)
for s in ['top', 'bottom', 'left', 'right']:
    ax.spines[s].set_visible(False)

plt.show()

  • total은 male과 female을 sum한 dataframe
  • male과 female을 total로 나눠서 비율 계산
  • ax.spines[s].set_visible(False)
    • spine은 plot의 테두리를 의미한다. set_visible(False) 로 테두리를 없애줌


Overlapped Bar Plot

  • .bar() 의 alpha 값을 조정해 overlapped bar plot 구현


Grouped Bar Plot

x축 조정, width 조정, xticks/xticklabels 테크닉 사용

fig, ax = plt.subplots(1, 1, figsize=(12, 7))
 
idx = np.arange(len(group['male'].index))  # (0, 1, 2, 3, 4)
width=0.35

ax.bar(idx-width/2, group['male'], 
       color='royalblue',
       width=width, label='Male')

ax.bar(idx+width/2, group['female'], 
       color='tomato',
       width=width, label='Female')

ax.set_xticks(idx)
ax.set_xticklabels(group['male'].index)
ax.legend()    
    
plt.show()

  • width default가 0.8인데, 한 bar에 두 개를 그린다면 width = 0.8/2 ≒ 0.35로 지정
  • 한 막대에 대해선 0.35만큼 빼주고, 한 막대에 대해선 0.35만큼 더해서 두 막대를 표시


그렇다면 그룹이 N개 일때는 어떻게 하면 될까요?

그룹의 개수에 따라 x좌표는 다음과 같습니다.

2개 : -1/2, +1/2
3개 : -1, 0, +1 (-2/2, 0, +2/2)
4개 : -3/2, -1/2, +1/2, +3/2
규칙이 보이시나요?

−N−12 에서  N−12 까지 분자에 2간격으로 커지는 것이 특징입니다.

그렇다면 index i(zero-index)에 대해서는 다음과 같이 x좌표를 계산할 수 있습니다.
x+N+1+2×i2×widthx+\frac{-N+1+2×i}{2}×width




정확한 Bar Plot

  • 왼쪽 그래프는 점수 차이가 크지 않음에도 차이가 매우 심해보이는 것처럼 보인다.
  • 이 땐 세로를 전체적으로 늘려준다.



적절한 공간 활용

  • margins는 그래프의 왼쪽, 오른쪽 gap으로 default는 0.05이다.
    • 이를 0.1로 늘려 좀 여유로운 이미지 제공
  • width default는 0.8
  • linewidth는 그래프의 선 굵기를 조정 가능
  • ax.gird(zorder=0) 은 plot에 grid를 추가



그 외

score_var = student.groupby('gender').std().T
ax.bar(idx-width/2, score['male'], 
       color='royalblue',
       width=width,
       label='Male',
       yerr=score_var['male'],
       capsize=10
      )

ax.bar(idx+width/2, score['female'], 
       color='tomato',
       width=width,
       label='Female',
       yerr=score_var['female'],
       capsize=10
      )

  • bar()에 yerr(y error)을 추가
  • error는 표준편차를 이용해 추가









※ 모든 이미지 및 코드 출처는 네이버 커넥트재단 부스트캠프 AI Tech 5기입니다. ※

profile
AI-Kid

0개의 댓글