이번 포스트에서 Python의 기본적인 시각화 라이브러리인 Matplotlib를 이용하여 이중 막대 그래프를 그려볼 예정이다.
사용할 예제 데이터는 다음과 같다.
- 여성 이용자의 연령별 카드이용건수가 가장 높은 분야
- 남성 이용자의 연령별 카드이용건수가 가장 높은 분야
두 테이블을 활용하여 남녀 연령별 카드 이용건수가 가장 높은 분야를 이중 막대그래프로 표현해보고자 한다.
1. 라이브러리 실행
먼저 작업에 필요한 패키지들을 실행해준다.
참고로 코드를 출력할 때마다 경고 메세지가 나오는 것이 신경쓰인다면, 아래와 같이 입력해주면 된다.
# 작업에 필요한 라이브러리 실행하기.
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
# 경고 메세지 무시하기.
import warnings
warnings.filterwarnings('ignore')
2. 테이블 블러오기
그리고 시각화하고자 하는 테이블들을 불러와준다.
# 예제 테이블 불러오기.
f_max = pd.read_csv('/Users/choisubin/Desktop/SubinChoi/DA/resultTable/f_max.csv', encoding='UTF8')
m_max = pd.read_csv('/Users/choisubin/Desktop/SubinChoi/DA/resultTable/m_max.csv', encoding='UTF8')
# 예제 테이블 출력하기.
print("여성 이용자의 연령별 카드이용건수가 가장 높은 분야 \n", f_max)
print("남성 이용자의 연령별 카드이용건수가 가장 높은 분야 \n", m_max)
출력한 예제 테이블의 모습은 다음과 같다.
3. 한글 깨짐 방지
IDE에 한글이 표기된 테이블을 불러오거나 그래프를 만들 때 한글이 깨지는 현상이 종종 발생한다.
이를 미리 방지해 주기 위해 한글 글씨체를 지정해 주는 단계가 필요하다.
Mac을 사용하면 'AppleGothic' 윈도우를 사용하면 'Malgun Gothic'으로 지정해주면 된다. (참고로 애플 고딕은 붙여서 입력해줘야 한다!)
# 한글 깨짐 방지를 위해 'AppleGothic' 지정해주기.
plt.rcParams['font.family'] = 'AppleGothic'
matplotlib.rcParams['axes.unicode_minus'] = False
4. 이중 막대 그래프
본격적으로 이중 막대 테이블을 만들어준다.
- fig, ax=plt.subplots() ➡️ 그래프 사이즈 지정
- bar_width ➡️ 막대 굵기 지정
- np.arange ➡️주어진 범위와 간격에 따라 균일한 값을 갖는 어레이 반환
- plt.legend() ➡️ 그래프 범례 추가
그래프 생성시 코드 마지막 부분에는 'plt.show()'를 꼭 입력해줘야 한다.
각 코드에 대한 자세한 설명은 코드창에 추가해두었다.
참고로 그래프 색상은 Coolors( https://coolors.co/palettes/trending )를 참고하였다.
# 남녀 이용자의 연령별 카드이용건수가 가장 높은 분야
# 그래프 사이즈, 바 굵기 조정하기.
fig, ax = plt.subplots(figsize=(12, 6))
bar_width = 0.25
# 연령대가 10대에서 60대까지이므로 6으로 지정해주기.
index = np.arange(6)
# 사용하고자 하는 테이블 삽입하기.
# alpha는 투명도, label은 범례를 의미하며, color에는 원하는 색상 코드를 삽입하면 됨.
mMax = plt.bar(index, m_max['카드이용건수 합계'], bar_width, alpha=0.7, color='#14213d', label = '남')
fMax = plt.bar(index+bar_width, f_max['카드이용건수 합계'], bar_width, alpha=0.7, color='#fca311', label = '여')
# x축 위치를 정 가운데로 조정하고 x축의 텍스트를 연령대 정보와 매칭하기.
plt.xticks(np.arange(bar_width, 6 + bar_width, 1), f_min['연령대별(AGE_GB)'])
# x축, y축 이름과 그래프 제목 설정하기.
plt.xlabel('연령대별', size=13)
plt.ylabel('카드이용건수 합계', size=13)
plt.legend()
plt.title('남녀 이용자의 연령별 카드이용건수가 가장 높은 분야', size=18)
plt.show()
5. 막대 그래프 위에 값 표시 (for문)
막대 상단에 값을 표시해주는 것도 추가로 알아보고자 한다.
보통 막대 상단에 수치를 표시해 주는데, 이번에는 텍스트를 표시해주도록 하겠다.
텍스트는 plt.text()를 이용하여 그래프의 좌표를 찍어서 원하는 위치에 표기를 해주면 된다.
- ha: 수평 정렬 설정 ('center', 'left', 'right')
- va: 수직 정렬 설정 ('center', 'top', 'bottom')
# 그래프에 텍스트 삽입 기본 형태.
plt.text(x, y, "text", fontsize=10, ha='center', va='center')
막대 간의 간격은 일정하기 때문에, 모든 막대에 값을 표시해주고 싶으면 반복문을 사용하면 된다.
- 텍스트를 반복적으로 표시해주고 싶은 컬럼에 대한 변수(fMaxUpjong, mMaxUpjong)를 설정해준다.
- 반복값 i와 range()를 이용하여 그 범위를 지정해준다.
- x,y 변수를 추가하여 반복하고자 하는 위치를 지정해준다.
# 막대 위에 업종 표시하기. (연령별로 1씩 차이가 나고, 성별은 0.25씩 차이가 남)
# for문 사용하기.
# 여성 이용자
fMaxUpjong = f_max['내국인업종분류(SB_UPJONG_NM)']
for i in range(len(fMaxUpjong)):
x = i + 0.25
y = f_max['카드이용건수 합계'][i] + 100
plt.text(x, y, fMaxUpjong[i],
fontsize=10, ha='center', va='bottom')
# 남성 이용자
mMaxUpjong = m_max['내국인업종분류(SB_UPJONG_NM)']
for i in range(len(mMaxUpjong)):
x = i + 0
y = m_max['카드이용건수 합계'][i] + 100
plt.text(x, y, mMaxUpjong[i],
fontsize=10, ha='center', va='bottom')
6. 전체 코드
위 코드를 모두 종합한 전체 코드이다.
# 남녀 이용자의 연령별 카드이용건수가 가장 높은 분야
# 그래프 사이즈, 바 굵기 조정하기.
fig, ax = plt.subplots(figsize=(12, 6))
bar_width = 0.25
# 연령대가 10대에서 60대까지이므로 6으로 지정해주기.
index = np.arange(6)
# 사용하고자 하는 테이블 삽입하기.
# alpha는 투명도, label은 범례를 의미하며, color에는 원하는 색상 코드를 삽입하면 됨.
mMax = plt.bar(index, m_max['카드이용건수 합계'], bar_width, alpha=0.7, color='#14213d', label = '남')
fMax = plt.bar(index+bar_width, f_max['카드이용건수 합계'], bar_width, alpha=0.7, color='#fca311', label = '여')
# x축 위치를 정 가운데로 조정하고 x축의 텍스트를 연령대 정보와 매칭하기.
plt.xticks(np.arange(bar_width, 6 + bar_width, 1), f_min['연령대별(AGE_GB)'])
# 막대 위에 업종 표시하기. (연령별로 1씩 차이가 나고, 성별은 0.25씩 차이가 남)
# for문 사용하기.
# 여성 이용자
fMaxUpjong = f_max['내국인업종분류(SB_UPJONG_NM)']
for i in range(len(fMaxUpjong)):
x = i + 0.25
y = f_max['카드이용건수 합계'][i] + 100
plt.text(x, y, fMaxUpjong[i],
fontsize=10,
horizontalalignment='center',
verticalalignment='bottom')
# 남성 이용자
mMaxUpjong = m_max['내국인업종분류(SB_UPJONG_NM)']
for i in range(len(mMaxUpjong)):
x = i + 0
y = m_max['카드이용건수 합계'][i] + 100
plt.text(x, y, mMaxUpjong[i],
fontsize=10,
horizontalalignment='center',
verticalalignment='bottom')
# x축, y축 이름과 그래프 제목 설정하기.
plt.xlabel('연령대별', size=13)
plt.ylabel('카드이용건수 합계', size=13)
plt.legend()
plt.title('남녀 이용자의 연령별 카드이용건수가 가장 높은 분야', size=18)
plt.show()
7. 결과 그래프
전체 코드를 실행하면 다음과 같은 그래프가 출력된다.
🔗 관련 링크
'Skills > Python' 카테고리의 다른 글
Matplotlib: 라인 차트와 파이 차트 그리기 (0) | 2024.04.06 |
---|---|
[학위논문] 데이터 분석 결과가 보여주는 결론 및 함의점 (0) | 2024.03.14 |
[학위논문] Python을 이용한 Tukey 사후검정(Tukey's Post-Hoc) (0) | 2024.02.02 |
[학위논문] Python을 이용한 이원배치 분산분석(Two-way ANOVA) (1) | 2024.02.01 |
[학위논문] 데이터를 수집하는 과정 (feat. 설문문항과 온라인 실험) (0) | 2024.02.01 |