Python 강좌 / Matplotlib로 분석 결과 시각화하기

Matplotlib은 데이터와 축·눈금·라벨을 명시해 그래프를 만드는 라이브러리입니다. 비교할 값과 단위가 분명한 막대그래프부터 시작하고, 화면 표시와 파일 저장을 구분해 실행 환경에 맞게 사용합니다.

비교 질문과 차트 종류

분류별 지출 합계를 비교하려면 범주를 가로축, 금액을 세로축에 둔 막대그래프가 적절할 수 있습니다. 날짜에 따른 변화를 보려면 순서가 있는 시계열이 필요합니다. 그래프는 잘못된 집계를 고쳐 주지 않으므로 먼저 수치·단위·누락 여부를 확인합니다.

관련 동작과 지원 조건은 Matplotlib로 분석 결과 시각화하기 관련 공식 문서에서 확인할 수 있습니다.

python -m pip install matplotlib

이 예제는 원본 분류 food·transport를 식비·교통으로 표시합니다. 한글을 지원하는 설치된 글꼴을 후보에서 선택하며 없으면 안내 오류로 중단합니다. 먼저 글꼴의 설치 여부와 이용 조건을 확인하고 필요하면 font_choices를 실제 설치된 글꼴명으로 바꿉니다.

집계값 준비와 저장 경로은 pandas로 표 데이터 정리하고 분석하기에서 사용하는 규칙과 연결됩니다.

전체 예제와 실행 결과

별도의 실습 폴더에서 아래 파일을 UTF-8로 저장합니다. 가상환경을 선택한 터미널에서 python chart.py 명령으로 실행합니다. macOS·Ubuntu에서 가상환경을 사용하지 않는 경우 명령 이름을 python3으로 바꿉니다.

chart.py 파일의 전체 내용입니다.

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
plt.rcParams.update({"font.size": 18, "axes.titlesize": 22, "axes.labelsize": 20, "xtick.labelsize": 18, "ytick.labelsize": 18})
from matplotlib import font_manager
font_choices = ['Malgun Gothic', 'AppleGothic', 'Noto Sans CJK KR']
available = {font.name for font in font_manager.fontManager.ttflist}
font_name = next((name for name in font_choices if name in available), None)
if font_name is None:
    raise RuntimeError("Install a font supporting the chart labels and restart Python")
plt.rcParams["font.family"] = font_name
plt.rcParams["axes.unicode_minus"] = False

categories = ["food", "transport"]
amounts = [11500, 2500]
fig, ax = plt.subplots(figsize=(7, 4), layout="constrained")
bars = ax.bar(categories, amounts, color=["#2b6cb0", "#d69e2e"])
ax.set_ylabel("금액 (원)")
ax.set_title("분류별 지출")
ax.set_xticks(range(len(categories)), ['식비', '교통'])
ax.set_ylim(0, max(amounts) * 1.2)
ax.bar_label(bars, fmt="%.0f", padding=3)
fig.savefig("expense-chart.png", dpi=160)
plt.close(fig)
print("saved expense-chart.png")

예상 결과는 다음과 같습니다.

saved expense-chart.png

Figure·Axes와 백엔드

Figure는 전체 그림, Axes는 좌표축과 데이터가 표시되는 영역입니다. fig와 ax를 명시하면 여러 그래프를 만들 때 어떤 그림을 수정하는지 알기 쉽습니다. Agg는 GUI 없이 파일을 만드는 백엔드이므로 서버나 자동 보고서에서 사용할 수 있습니다.

데스크톱에서 창으로 보려면 Agg 지정 줄을 제거하고 저장 뒤 plt.show()를 사용합니다. 실행 환경에 GUI 지원이 없으면 창이 뜨지 않을 수 있습니다. 반복 생성 후 close를 호출해 사용한 그림 자원을 정리합니다.

정확하게 비교할 수 있는 출력 확인

  1. 저장 파일을 열어 두 막대와 11500·2500 라벨이 보이는지 확인합니다.
  2. 축 단위가 KRW인지, 0에서 시작하는지 확인합니다.
  3. 그림 폭을 좁혀 라벨 겹침·잘림을 확인한 뒤 원래 크기로 되돌립니다.

savefig는 같은 이름의 파일을 덮어씁니다. 보고서 버전이 필요하면 날짜나 실행 ID가 있는 새 경로를 정하세요. 축을 자르거나 면적·색을 과장해 작은 차이를 큰 차이처럼 보이게 만들지 않습니다.

아래 그래프는 위의 실행 코드를 실제로 실행하여 저장한 결과이며 food 11,500과 transport 2,500을 같은 0 기준 축으로 비교합니다. 한글·일본어 라벨로 바꾸려면 해당 문자를 지원하는 설치된 글꼴을 지정해야 합니다. 아래 글꼴 설정은 운영체제에 실제로 있는 파일 경로로 바꾼 뒤 pyplot으로 그림을 만들기 전에 적용합니다. 글꼴만 바꿔도 데이터와 막대 높이는 바뀌지 않아야 합니다.

식비 11,500원과 교통비 2,500원을 비교하는 막대그래프

설치된 글꼴의 전체 경로를 font_path에 지정합니다. Windows의 예는 맑은 고딕이며 macOS·Linux에서는 실제 설치된 한국어 글꼴 경로로 바꿉니다.

from matplotlib import font_manager
font_path = "C:/Windows/Fonts/malgun.ttf"
font_manager.fontManager.addfont(font_path)
plt.rcParams["font.family"] = font_manager.FontProperties(fname=font_path).get_name()
plt.rcParams["axes.unicode_minus"] = False

위 설정은 import matplotlib.pyplot as plt 뒤, fig 생성 전에 넣습니다. 라벨도 ax.set_title("분류별 지출")처럼 별도로 번역하고 저장된 이미지에서 네모나 누락 글자가 없는지 확인합니다.

이 동작과 적용 조건의 공식 설명: Matplotlib: FontProperties