데이터 시각화에서 100% 누적 영역 차트는 각 항목이 전체에서 차지하는 비중을 시간의 흐름에 따라 한눈에 보여주는 강력한 도구입니다. Python의 대표적인 시각화 라이브러리인 Matplotlib에서는 stackplot() 함수를 사용해 손쉽게 구현할 수 있습니다.
구현 단계
Matplotlib로 누적 영역 차트를 만들려면 다음 순서대로 진행합니다.
- 그림 크기 설정 – figure 크기를 지정하고 서브플롯 주변 및 사이 여백(padding)을 조정합니다.
- 연도 데이터 준비 – x축에 표시할 연도(year) 리스트를 생성합니다.
- 딕셔너리 구성 – 각 연도별 인구 수를 대륙별로 담은 딕셔너리를 만듭니다.
- figure와 subplot 생성 –
plt.subplots()로 그림 객체와 축(ax)을 준비합니다. - 누적 영역 그래프 그리기 –
ax.stackplot()을 호출해 데이터를 쌓아 올립니다. - 범례 배치 –
loc='upper left'옵션으로 그림의 좌측 상단에 범례를 표시합니다. - 제목·축 레이블 설정 –
set_title(),set_xlabel(),set_ylabel()로 차트 정보를 추가합니다. - 차트 출력 –
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()
실행 결과
코드를 실행하면 대륙별 인구가 아래로부터 차곡차곡 쌓인 형태의 누적 영역 차트가 출력됩니다. 각 색상 영역의 두께가 해당 대륙 인구 규모를 의미하며, 전체 윤곽선은 세계 총인구의 증가 추세를 보여줍니다.

참고: 진짜 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% 범위로 고정되어, 시간이 지나도 각 대륙이 세계 인구에서 차지하는 상대적 비중의 변화를 명확하게 비교할 수 있습니다.