Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 Matplotlib로 막대그래프 X축 아래에 표(Table) 정렬하기

데이터 시각화를 할 때 그래프와 함께 상세 수치를 표 형태로 보여주면 가독성이 크게 향상됩니다. 파이썬의 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축 아래에는 각 연도별 세부 수치가 담긴 테이블이 정렬되어 함께 출력됩니다.