Python을 이용하여 양방향 막대 그래프 그리기
오늘은 알아두면 꽤 유용하게 사용할 때가 있는 막대그래프의 한 종류인 양방향 막대 그래프 그리는 법에 대해 알아보자
양방향 막대 그래프는 성별에 따른 연령별 인구 수를 나타낼 때 가장 많이 쓰인다.
그림을 보면 아 이게 양방향 그래프이구나 하고 바로 알 수 있는 익숙하지만 어떻게 그려야 할 지 방법은 잘 모르겠는 그래프를 파이썬으로 그리는 방법을 알아보자.
다음과 같은 성별과 따른 인구수 데이터가 있다고 해보자.
* 데이터는 통계청에서 가져온 인구총조사 21년도 데이터이다. (연령 및 성별 인구)
https://kostat.go.kr/unifSearch/search.es
이 데이터를 가장 잘 표현할 수 있는 그래프는 위에서도 설명했다싶이 막대그래프 그 중에서도 양방향 막대 그래프(Bi-direction bar chart) 일 것이다.
이 그래프를 파이썬으로 그리는 법은 가로로 막대 그래프를 그릴 수 있게 해주는 barh 함수를 사용하여 약간의 꼼수를 쓰면 된다.
다시 말해 왼쪽에 그릴 그래프 값을 마이너스로 바꿔주면 된다.
1. 기본 그리기
아래의 #1 그래프처럼 남자의 인구 수를 왼쪽에 여자를 오르쪽에 그리고 싶다고 하자.
그렇다면, 가로형 막대를 그리는 barh 함수에서 연령 변수를 먼저 써주고 남자의 인구 수 데이터 앞에 "-"를 붙여주면 된다.
( 연령 값이 여기서처럼 Index가 아니라 변수라면 Population.index 대신 Population['Age']를 사용하면 된다.)
#1
fig, ax = plt.subplots(1,1, figsize=(15,6))
ax.barh(Population.index, -Population['Male'], color = 'lightgrey')
ax.barh(Population.index, Population['Female'], color = 'lightsteelblue')
ax.legend(['Male', 'Female'], loc="lower right")
2. 변형 - 거꾸로 그리기
만약 나이를 높은 순에서 낮은 순으로 바꿔주고 싶다면, 데이터 프레임 전체를 바꾸는 번거로운 방법보다는 문자열을 거꾸로 출력할 수 있는 array 사용법인 [::-1] 를 사용하자.
나이 변수와 인구 수 변수에 모두 [::-1] 를 붙여줘야 된다. 그렇지 않다면 서로 거꾸로 매칭되는 결과가 나오지 주의하자.
#2
fig, ax = plt.subplots(1,1, figsize=(15,6))
ax.barh(Population.index[::-1], -Population['Male'][::-1], color = 'lightgrey')
ax.barh(Population.index[::-1], Population['Female'][::-1], color = 'lightsteelblue')
ax.legend(['Male', 'Female'], loc="lower right")
위와 같은 그래프를 그릴 수 있다.
3. 기타 - 데이터 레이블 표시하기
데이터 레이블을 표시하고 싶다면 annotate 함수를 사용하면 된다.
우선 레이블로 사용할 데이터를 써주고 그 다음으로는 위치를 지정해주면 된다.
va는 레이블의 높낮이를 지정할 수 있는 옵션이며, 5가지의 선택사항이 있다.
ha는 레이블의 좌우 위치를 지정할 수 있는 옵션이며, 3가지의 선택사항이 있다.
이와 같은 선택사항은 직접 해보며 익히는 게 가장 효과적인 방법이라고 생각하여 직접 실습을 해보기를 바란다.
va 선택사항 : 'top', 'bottom', 'center', 'baseline', 'center_baseline'
ha 선택사항 : 'center', 'right', 'left'
#3
fig, ax = plt.subplots(1,1, figsize=(15,6))
ax.barh(Population.index, -Population['Male'], color = 'lightgrey')
ax.barh(Population.index, Population['Female'], color = 'lightsteelblue')
for i in Population.index:
ax.annotate(f"{Population['Male'][i]}", # 그래프에 표시할 값
xy = (-Population['Male'][i], i), # 표시할 위치(x, y 순서)
va = 'center', ha='right') # 레이블의 위치
for i in Population.index:
ax.annotate(f"{Population['Female'][i]}",
xy = (Population['Male'][i], i),
va = 'center', ha='left')
ax.legend(['Male', 'Female'], loc="lower right")
다음시간에...
다음에는 위에서 배웠던 데이터 레이블을 깔끔하게 표시하는 방법에 대해 알아보겠다.
2023.06.10 - [self.python] - [python] 양방향 막대 그래프 그리기 2 - 천단위 콤마, 레이블 위치
'self.python' 카테고리의 다른 글
[python] 양방향 막대 그래프 그리기 2 - 천단위 콤마, 레이블 위치 (0) | 2023.06.10 |
---|---|
[python] seaborn으로 HeatMap 그리기 - 2 (최대값/최소값, Cbar, tick, Label 조절하여 그래프 그리기) (1) | 2022.12.05 |
[python] seaborn으로 HeatMap 그리기 - 1 (0) | 2022.11.06 |
[python] 데이터 프레임 전처리 - replace 이용하기 (0) | 2022.07.03 |
[python] 숫자 데이터 자리수 맞추어 표시하기(앞에 0 채워주기) - zfill() (0) | 2022.06.27 |
댓글