파이썬 Matplotlib·Seaborn 시각화: 한글 폰트 깨짐 해결

Matplotlib과 Seaborn으로 선·분포·관계형 차트를 만들고, 운영체제와 서버에서 한글 폰트 깨짐을 해결하는 방법을 코드로 설명합니다.

본문 상단 광고 구역 (승인 후 자동 노출됩니다)
여러 통계 차트를 분석하는 파이썬 데이터 시각화 대표 이미지
파이썬 Matplotlib·Seaborn 시각화와 한글 폰트 해결

파이썬에서 업무용 차트를 만들 때는 Matplotlib로 축과 세부 요소를 제어하고, Seaborn으로 통계형 차트를 빠르게 그리는 조합이 실용적입니다. 한글이 네모나 빈칸으로 깨지는 문제는 한글 글꼴을 설치한 뒤 Matplotlib에 그 글꼴을 명시하고, 음수 기호 설정까지 확인하면 해결할 수 있습니다.

Matplotlib 공식 글꼴 설정 문서 보기

핵심 요약

  • Matplotlib는 세밀한 제어, Seaborn은 통계 시각화와 보기 좋은 기본값에 강합니다.
  • 객체지향 방식인 fig, ax = plt.subplots()를 사용하면 복잡한 차트 관리가 쉽습니다.
  • 한글 깨짐은 사용 가능한 한글 글꼴 이름을 확인하고 font.family에 지정해 해결합니다.
  • 저장 전 tight_layout() 또는 constrained_layout으로 글자 잘림을 확인합니다.

Matplotlib와 Seaborn은 역할이 다릅니다

필요한 작업 추천 이유
선·막대·주석·축 세부 제어 Matplotlib Figure와 Axes를 직접 제어
분포·범주·관계 비교 Seaborn 통계형 함수와 보기 좋은 기본값
여러 패널 비교 Seaborn figure-level 또는 Matplotlib subplot Facet과 레이아웃 관리
최종 보고서 출력 두 도구 조합 Seaborn 결과도 Matplotlib 객체에서 수정 가능

Seaborn은 Matplotlib를 기반으로 동작합니다. 따라서 Seaborn으로 차트를 만든 뒤에도 ax.set_title(), ax.legend(), fig.savefig() 같은 Matplotlib API로 마무리할 수 있습니다.

객체지향 방식으로 기본 차트 만들기

import matplotlib.pyplot as plt
import seaborn as sns

sns.set_theme(style="whitegrid")
fig, ax = plt.subplots(figsize=(8, 5), constrained_layout=True)

sns.lineplot(
    data=df,
    x="month",
    y="sales",
    hue="channel",
    marker="o",
    ax=ax
)
ax.set_title("월별 채널 매출")
ax.set_xlabel("월")
ax.set_ylabel("매출")
fig.savefig("monthly-sales.png", dpi=150, bbox_inches="tight")

plt.plot()만 이어 쓰는 방식보다 Figure와 Axes를 변수로 받으면 여러 차트를 만들 때 대상이 섞이지 않습니다. Seaborn의 hue는 범주별 색상을, style은 선이나 마커 형태를 구분합니다. 색만으로 정보를 나누면 흑백 인쇄나 색각 차이에서 구분이 어려울 수 있으므로 마커와 선 스타일도 함께 고려하세요.

차트 종류 선택

  • 시간 흐름: lineplot
  • 두 수치의 관계: scatterplot
  • 범주별 크기: barplot
  • 분포 확인: histplot 또는 boxplot
  • 여러 변수의 상관 패턴: heatmap

파이 차트는 항목이 많으면 비교가 어려워집니다. 정확한 순위 비교가 목적이면 정렬된 막대그래프가 더 읽기 쉽습니다.

한글 폰트 깨짐 해결 순서

Matplotlib의 기본 DejaVu Sans는 많은 유럽 문자를 포함하지만 한글 표시 환경은 별도 확인이 필요합니다. 먼저 운영체제에 한글 글꼴이 실제로 설치되어 있는지 확인하세요.

from matplotlib import font_manager, rcParams

names = sorted({f.name for f in font_manager.fontManager.ttflist})
print([name for name in names if "Nanum" in name or "Noto" in name])

rcParams["font.family"] = "Noto Sans CJK KR"  # 실제 설치 이름 사용
rcParams["axes.unicode_minus"] = False

Windows라면 환경에 따라 맑은 고딕, macOS라면 Apple SD Gothic Neo 등이 있을 수 있지만 이름을 추측하지 말고 목록에서 확인해야 합니다. 리눅스 서버나 Docker에서는 로컬 PC 글꼴이 자동으로 따라오지 않으므로 이미지 생성 환경에도 글꼴 패키지나 파일을 배치해야 합니다.

글꼴 파일을 직접 지정하는 방법

from matplotlib import font_manager

font_path = "/app/fonts/NotoSansKR-Regular.ttf"
font_prop = font_manager.FontProperties(fname=font_path)
ax.set_title("월별 매출", fontproperties=font_prop)

개별 텍스트에 fontproperties를 지정하면 전역 설정 충돌을 줄일 수 있습니다. 배포 시에는 글꼴 라이선스와 재배포 허용 범위를 확인하세요. 설정을 바꿨는데도 이전 결과가 남으면 실행 프로세스를 재시작하고 Matplotlib 캐시 위치를 확인합니다.

저장할 때 해상도와 잘림을 확인하세요

화면에서 선명해 보여도 문서에 삽입하면 흐릴 수 있습니다. 웹 게시용 PNG는 필요한 실제 표시 크기에 맞추고, 인쇄나 확대가 필요한 선형 차트는 SVG 또는 PDF 같은 벡터 형식도 검토하세요. 투명 배경은 transparent=True, 여백은 bbox_inches="tight"로 조절할 수 있습니다.

읽기 쉬운 차트 기준

  • 제목에는 무엇을 비교하는지 씁니다.
  • 축 이름과 단위를 생략하지 않습니다.
  • 색상 수를 필요한 범주 수로 제한합니다.
  • 0에서 시작하지 않는 축은 왜 필요한지 검토합니다.
  • 범례가 차트를 가리면 위치나 열 수를 조절합니다.
  • 중요한 값만 주석으로 강조합니다.

실수 방지 체크리스트

  • 데이터 자료형과 결측치를 시각화 전에 확인합니다.
  • Figure와 Axes 객체를 명시적으로 사용합니다.
  • 서버에 한글 글꼴이 설치됐는지 확인합니다.
  • 실제 설치된 글꼴 이름을 설정합니다.
  • 음수 기호가 네모로 나오면 axes.unicode_minus를 확인합니다.
  • 저장 파일을 직접 열어 제목·범례·축 잘림을 봅니다.
  • 범주를 색상 하나로만 구분하지 않습니다.

자주 묻는 질문

1. Seaborn만 설치하면 Matplotlib가 없어도 되나요?

Seaborn은 Matplotlib 기반이므로 일반적으로 Matplotlib가 함께 필요합니다.

2. plt와 ax 방식의 차이는 무엇인가요?

plt 상태 기반 방식은 간단하고, ax 객체지향 방식은 여러 그림을 정확히 제어하기 좋습니다.

3. 한글이 네모로 나오는 이유는?

현재 선택된 글꼴에 한글 글리프가 없거나 실행 환경에 글꼴이 설치되지 않았기 때문입니다.

4. 글꼴 설정은 매번 해야 하나요?

프로젝트 시작 코드나 matplotlibrc에 설정할 수 있지만 다른 환경에서도 같은 글꼴이 존재해야 합니다.

5. 마이너스 기호만 깨집니다.

rcParams["axes.unicode_minus"] = False를 확인하세요.

6. 저장 이미지가 흐립니다.

표시 크기에 맞춰 figsize와 dpi를 높이거나 벡터 형식을 사용하세요.

7. 그래프가 잘립니다.

constrained_layout=True 또는 저장 시 bbox_inches="tight"를 사용하고 결과 파일을 검수하세요.

8. Seaborn의 figure-level 함수는 무엇인가요?

relplot, catplot처럼 Figure 전체와 Facet을 관리하는 함수입니다.

9. 색상 팔레트는 어떻게 고르나요?

연속값, 범주, 중심값 여부에 맞는 팔레트를 고르고 명도 대비와 색각 접근성을 확인하세요.

10. 대용량 데이터는 그대로 그려도 되나요?

점이 지나치게 많으면 해석과 렌더링이 모두 어려우므로 목적에 맞게 집계하거나 표본화하세요.

공식 출처

공식 문서 확인일: 2026년 9월 5일. 함수 인수와 기본 테마는 버전에 따라 달라질 수 있습니다.

본문 하단 광고 구역