일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- IRIS
- pytorch
- r
- 코딩테스트
- 이것이 코딩테스트다
- 데이터분석준전문가
- 통계
- 데이터분석
- 데이터 전처리
- Google ML Bootcamp
- sklearn
- 딥러닝
- scikit learn
- SQL
- 이코테
- 태블로
- ML
- 파이썬
- Deep Learning Specialization
- 데이터 분석
- 시각화
- ADsP
- matplotlib
- SQLD
- Python
- pandas
- 회귀분석
- tableau
- 머신러닝
- 자격증
- Today
- Total
함께하는 데이터 분석
[Python] Matplotlib 다중 막대그래프 본문
오늘은 저번 포스트에서 말씀드린 대로
다중 막대그래프를 그리는 법을
간단히 알아보겠습니다.
라이브러리 불러오기
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()
여기까지 하고 막대그래프는 마무리하겠습니다.
다음에는 파이 차트로 오겠습니다!
'데이터분석 공부 > Python' 카테고리의 다른 글
[Python] Matplotlib boxplot 그리기 (0) | 2022.04.12 |
---|---|
[Python] Matplotlib 파이 차트 그리기 (0) | 2022.04.09 |
[Python] Matplotlib 누적 막대그래프 (0) | 2022.04.05 |
[Python] Matplotlib 막대그래프 그리기 (2) | 2022.04.04 |
[Python] Matplotlib 산점도 그래프 그리기 (0) | 2022.03.31 |