함께하는 데이터 분석

[Python] Matplotlib 다중 막대그래프 본문

데이터분석 공부/Python

[Python] Matplotlib 다중 막대그래프

JEONGHEON 2022. 4. 8. 23:06

오늘은 저번 포스트에서 말씀드린 대로

 

다중 막대그래프를 그리는 법을

 

간단히 알아보겠습니다.

 

 

라이브러리 불러오기

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plt.rc('font', family = 'AppleGothic') # mac 
# plt.rc('font', family = 'Malgun Gothic') # window
plt.rc('font', size = 12)
plt.rc('axes', unicode_minus = False) # -표시 오류 잡아줌

저번 시간과 다른 점은

 

numpy를 라이브러리를 사용해야 돼서

 

numpy를 np로 불러왔습니다

 

 

데이터 생성

# 년도
year = [2018, 2019, 2020, 2021, 2022]

# 만명 단위
physics = [6.2,6.3 ,6.0 ,5.9 ,6.8] 
chemistry = [10.6,9.4 ,8.0 ,8.0 ,8.0]
life = [16.1,16.3 ,13.9 ,13.1 ,14.7]
earth = [16.7,17.7 ,16.1 ,13.0 ,14.9]

 

science = {
    "year" : year,
    "physics" : physics,
    "chemistry" : chemistry,
    "life" : life,
    "earth" : earth
}

 

sci = pd.DataFrame(science)
sci

여기까지는 똑같습니다.

 

이번에는 학년도를 기준으로 과학탐구 응시자 수의 전체(Total)를 생성해보겠습니다.

 

sci['total'] = sci['physics'] + sci['chemistry'] + sci['life'] + sci['earth']
sci

이제 total변수가 생긴 것을 확인할 수 있습니다.

 

 

다중 막대그래프 그리기

w = 0.15
nrow = sci.shape[0] # 행의 갯수
idx = np.arange(nrow) #행의 갯수를 리스트로
idx

>>> array([0, 1, 2, 3, 4])

w는 widths의 약자로 설정해봤습니다.

 

다중 막대그래프를 그리려면 index를 설정해주고

 

w를 더하거나 빼줘서 막대그래프의 위치를

 

조절하는 메커니즘입니다.

 

plt.figure(figsize = (10, 5))
plt.bar(idx - w, sci['physics'])
plt.bar(idx + w, sci['chemistry'])
plt.show()

이렇게 겹치지 않게 설정해줄 수 있습니다.

 

그럼 이제 한 번에

 

물리, 화학, 생명, 지구, 전체를 그려볼까요?

 

plt.figure(figsize = (10, 5))
plt.bar(idx - 2 * w, sci['physics'])
plt.bar(idx - w, sci['chemistry'])
plt.bar(idx, sci['life'])
plt.bar(idx + w, sci['earth'])
plt.bar(idx + 2 * w, sci['total'])
plt.show()

이렇게 처음 물리는 2w만큼 빼주고

 

화학은 w만큼, 생명은 그대로, 지구는 w만큼 더해주고 마지막으로 total은 2w만큼 더해줬습니다.

 

하지만 이렇게 그리면 약간은 보이지만 겹쳐서 잘 안 보이는 것은 비슷하죠.

 

막대의 넓이를 조절하는 방법이 기억나시나요?

 

plt.figure(figsize = (10, 5))
plt.bar(idx - 2 * w, sci['physics'], width = w)
plt.bar(idx - w, sci['chemistry'], width = w)
plt.bar(idx, sci['life'], width = w)
plt.bar(idx + w, sci['earth'], width = w)
plt.bar(idx + 2 * w, sci['total'], width = w)
plt.show()

이렇게 width인자를 통해 넣어줬었습니다.

 

이제 모든 그래프가 잘 보이네요.

 

하지만 누적 막대그래프를 그리다 보니

 

x축의 학년도가 설정이 안 돼 있네요.

 

x축에 index대신 학년도를 넣어볼게요.

 

 

x축에 index대신 학년도 넣기

plt.figure(figsize = (10, 5))
plt.bar(idx - 2 * w, sci['physics'], width = w)
plt.bar(idx - w, sci['chemistry'], width = w)
plt.bar(idx, sci['life'], width = w)
plt.bar(idx + w, sci['earth'], width = w)
plt.bar(idx + 2 * w, sci['total'], width = w)
plt.xticks(idx, sci['year'], rotation = 30)
plt.show()

plt.xticks를 이용했습니다.

 

그 전에는 rotation만 활용했었는데

 

이런 기능도 가지고 있습니다.

 

이제는 익숙하시겠지만 범례를 달아주겠습니다.

 

plt.figure(figsize = (10, 5))
plt.bar(idx - 2 * w, sci['physics'], width = w, label = '물리학')
plt.bar(idx - w, sci['chemistry'], width = w, label = '화학')
plt.bar(idx, sci['life'], width = w, label = '생명과학')
plt.bar(idx + w, sci['earth'], width = w, label = '지구과학')
plt.bar(idx + 2 * w, sci['total'], width = w, label = '총 응시자 수')
plt.xticks(idx, sci['year'], rotation = 30)
plt.legend(ncol = nrow) # nrow = sci.shape[0]인 5
plt.show()

그래프를 그려보니 범례를 column기준으로 설정하는 것이 보기에 편해 보이네요.

 

이제는 마지막으로 x와 y축 label, 마지막으로 title까지 달아주고 마무리하겠습니다.

 

plt.figure(figsize = (10, 5))
plt.title('학년도 기준 수능 과학탐구 응시자 수')
plt.xlabel('학년도')
plt.ylabel('응시자 수(단위 : 만명)')
plt.bar(idx - 2 * w, sci['physics'], width = w, label = '물리학')
plt.bar(idx - w, sci['chemistry'], width = w, label = '화학')
plt.bar(idx, sci['life'], width = w, label = '생명과학')
plt.bar(idx + w, sci['earth'], width = w, label = '지구과학')
plt.bar(idx + 2 * w, sci['total'], width = w, label = '총 응시자 수')
plt.xticks(idx, sci['year'], rotation = 30)
plt.legend(ncol = 5)
plt.show()

여기까지 하고 막대그래프는 마무리하겠습니다.

 

다음에는 파이 차트로 오겠습니다!