본문 바로가기
self.python

[python] 양방향 막대 그래프 그리기 - barh 함수 사용

by 톤토니 2023. 5. 20.
반응형

Python을 이용하여 양방향 막대 그래프 그리기

 

오늘은 알아두면 꽤 유용하게 사용할 때가 있는 막대그래프의 한 종류인 양방향 막대 그래프 그리는 법에 대해 알아보자

양방향 막대 그래프는 성별에 따른 연령별 인구 수를 나타낼 때 가장 많이 쓰인다.

그림을 보면 아 이게 양방향 그래프이구나 하고 바로 알 수 있는 익숙하지만 어떻게 그려야 할 지 방법은 잘 모르겠는 그래프를 파이썬으로 그리는 방법을 알아보자.

 

 

다음과 같은 성별과 따른 인구수 데이터가 있다고 해보자.

* 데이터는 통계청에서 가져온 인구총조사 21년도 데이터이다. (연령 및 성별 인구)

 

https://kostat.go.kr/unifSearch/search.es

 

통계청 통합검색

검색어''에 대한 검색 결과를 찾을 수 없습니다. 단어의 철자가 정확한지 확인해 주시기 바랍니다. 일반적으로 많이 사용하는 검색어로 검색해주시기 바랍니다.

kostat.go.kr

 

 

이 데이터를 가장 잘 표현할 수 있는 그래프는 위에서도 설명했다싶이 막대그래프 그 중에서도 양방향 막대 그래프(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")

 

 

#1 결과 그래프

 

 

 

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")

 

 

#2 결과 그래프

위와 같은 그래프를 그릴 수 있다.

 

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")

 

 

#3 결과 그래프

 

다음시간에...

다음에는 위에서 배웠던 데이터 레이블을 깔끔하게 표시하는 방법에 대해 알아보겠다.

2023.06.10 - [self.python] - [python] 양방향 막대 그래프 그리기 2 - 천단위 콤마, 레이블 위치

 

[python] 양방향 막대 그래프 그리기 2 - 천단위 콤마, 레이블 위치

양방향 막대 그래프 그리기 2 - 천단위 콤마, 레이블 위치 위에 링크에서 지난시간 양방향 그래프를 그리는 기본적인 방법부터 알아보았었다 이번 시간에는 이 그래프를 좀 더 깔끔하게 표현할

selfimprove39.tistory.com

 

 

 

 

반응형

댓글