데이터 시각화를 할 때 그래프와 함께 상세 수치를 표 형태로 보여주면 가독성이 크게 향상됩니다. 파이썬의 matplotlib 라이브러리에서는 plt.table() 함수를 활용해 막대그래프의 X축 아래에 테이블을 정렬할 수 있습니다. 이 글에서는 재해별 손실 데이터를 누적 막대그래프와 테이블로 함께 시각화하는 방법을 단계별로 살펴보겠습니다.
구현 단계
그림(figure) 크기를 설정하고 서브플롯 주변의 여백(padding)을 조정합니다.
데이터프레임에 사용할 데이터 목록을 생성합니다.
데이터프레임의 열(columns) 이름을 튜플로 만듭니다.
행(rows)과 값(values) 목록을 준비합니다.
value_increment변수를 초기화합니다.준비한 데이터 포인트로 막대그래프(bar plot)를 그립니다.
그래프 하단에 데이터를 테이블 형태로 배치합니다.
그래프의 y축 레이블, yticks, xticks 및 제목(title)을 설정합니다.
plt.show()메서드를 호출하여 그림을 화면에 출력합니다.
전체 예제 코드
import numpy as np
import matplotlib.pyplot as plt
# 그림 크기 및 자동 레이아웃 설정
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
# 재해별 손실 데이터
data = [
[66386, 174296, 75131, 577908, 32015],
[58230, 381139, 78045, 99308, 160454],
[89135, 80552, 152558, 497981, 603535],
[78415, 81858, 150656, 193263, 69638],
[139361, 331509, 343164, 781380, 52269]
]
# 열과 행 레이블 정의
columns = ('Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
rows = ['%d year' % x for x in (100, 50, 20, 10, 5)]
values = np.arange(0, 2500, 500)
value_increment = 1000
# 색상 팔레트 생성
colors = plt.cm.BuPu(np.linspace(0, 0.5, len(rows)))
n_rows = len(data)
index = np.arange(len(columns)) + 0.3
bar_width = 0.4
y_offset = np.zeros(len(columns))
cell_text = []
# 누적 막대그래프 그리기
for row in range(n_rows):
plt.bar(index, data[row], bar_width, bottom=y_offset, color=colors[row])
y_offset = y_offset + data[row]
cell_text.append(['%1.1f' % (x / 1000.0) for x in y_offset])
# 색상 순서 반전 후 테이블 생성
colors = colors[::-1]
cell_text.reverse()
the_table = plt.table(cellText=cell_text,
rowLabels=rows,
rowColours=colors,
colLabels=columns,
loc='bottom')
# 서브플롯 위치 조정
plt.subplots_adjust(left=0.2, bottom=0.2)
# 축 레이블과 제목 설정
plt.ylabel("Loss in ${0}'s".format(value_increment))
plt.yticks(values * value_increment, ['%d' % val for val in values])
plt.xticks([])
plt.title('Loss by Disaster')
plt.show()핵심 포인트 정리
loc='bottom'옵션을 사용하면 테이블이 그래프의 X축 아래에 자동으로 정렬됩니다.y_offset배열을 누적시켜 각 재해 항목의 손실액을 쌓인(stacked) 형태의 막대그래프로 표현했습니다.cell_text에는 값을 1000으로 나눈 결과를 저장하여 테이블 셀에 천 단위 기준의 수치가 표시되도록 했습니다.plt.xticks([])로 X축 눈금 레이블을 제거하면 테이블의 열 레이블과 자연스럽게 연결됩니다.
실행 결과
위 코드를 실행하면 재해(Freeze, Wind, Flood, Quake, Hail)별 손실액이 누적 막대그래프로 표현되고, 그래프의 X축 아래에는 각 연도별 세부 수치가 담긴 테이블이 정렬되어 함께 출력됩니다.