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

Matplotlib로 100% 누적 영역 차트(Stacked Area Chart) 만드는 방법

데이터 시각화에서 100% 누적 영역 차트는 각 항목이 전체에서 차지하는 비중을 시간의 흐름에 따라 한눈에 보여주는 강력한 도구입니다. Python의 대표적인 시각화 라이브러리인 Matplotlib에서는 stackplot() 함수를 사용해 손쉽게 구현할 수 있습니다.

구현 단계

Matplotlib로 누적 영역 차트를 만들려면 다음 순서대로 진행합니다.

  1. 그림 크기 설정 – figure 크기를 지정하고 서브플롯 주변 및 사이 여백(padding)을 조정합니다.
  2. 연도 데이터 준비 – x축에 표시할 연도(year) 리스트를 생성합니다.
  3. 딕셔너리 구성 – 각 연도별 인구 수를 대륙별로 담은 딕셔너리를 만듭니다.
  4. figure와 subplot 생성plt.subplots()로 그림 객체와 축(ax)을 준비합니다.
  5. 누적 영역 그래프 그리기ax.stackplot()을 호출해 데이터를 쌓아 올립니다.
  6. 범례 배치loc='upper left' 옵션으로 그림의 좌측 상단에 범례를 표시합니다.
  7. 제목·축 레이블 설정set_title(), set_xlabel(), set_ylabel()로 차트 정보를 추가합니다.
  8. 차트 출력plt.show() 메서드로 최종 결과를 화면에 표시합니다.

예제 코드

아래 예제는 1950년부터 2018년까지 대륙별 세계 인구 변화를 누적 영역 차트로 나타낸 것입니다.

import matplotlib.pyplot as plt

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

year = [1950, 1960, 1970, 1980, 1990, 2000, 2010, 2018]

population_by_continent = {
    'africa': [228, 284, 365, 477, 631, 814, 1044, 1275],
    'americas': [340, 425, 519, 619, 727, 840, 943, 1006],
    'asia': [1394, 1686, 2120, 2625, 3202, 3714, 4169, 4560],
    'europe': [220, 253, 276, 295, 310, 303, 294, 293],
    'oceania': [12, 15, 19, 22, 26, 31, 36, 39],
}

fig, ax = plt.subplots()
ax.stackplot(year, population_by_continent.values(),
             labels=population_by_continent.keys())

ax.legend(loc='upper left')
ax.set_title('World population')

ax.set_xlabel('Year')
ax.set_ylabel('Number of people (millions)')

plt.show()

실행 결과

코드를 실행하면 대륙별 인구가 아래로부터 차곡차곡 쌓인 형태의 누적 영역 차트가 출력됩니다. 각 색상 영역의 두께가 해당 대륙 인구 규모를 의미하며, 전체 윤곽선은 세계 총인구의 증가 추세를 보여줍니다.

Matplotlib로 100% 누적 영역 차트(Stacked Area Chart) 만드는 방법

참고: 진짜 100% 비율 차트로 만들기

위 예제는 절대값(백만 명) 기준의 누적 차트입니다. 각 항목의 비율(%)을 기준으로 하는 진정한 100% 누적 차트를 원한다면, 연도별 전체 합계로 값을 나누어 정규화한 뒤 stackplot()에 전달하면 됩니다.

import numpy as np

totals = np.sum(list(population_by_continent.values()), axis=0)
percentages = {
    k: np.array(v) / totals * 100
    for k, v in population_by_continent.items()
}

ax.stackplot(year, percentages.values(),
             labels=percentages.keys())
ax.set_ylabel('Share of world population (%)')

이렇게 하면 y축이 항상 0~100% 범위로 고정되어, 시간이 지나도 각 대륙이 세계 인구에서 차지하는 상대적 비중의 변화를 명확하게 비교할 수 있습니다.