한글 폰트 설정
민서는 그래프 제목을 한글로 붙이려다 멈췄습니다. 화면에 네모난 박스들이 줄지어 있었습니다. 글자 대신 두부 조각처럼 생긴 기호들이 제목 자리를 차지하고 있었습니다.
"선배, 한글이 안 나와요."
"아, 그거. Matplotlib 기본 폰트가 한글을 못 읽어서 그래. 설정 한 번만 해주면 돼."
왜 한글이 안 나오는가
Matplotlib이 기본으로 사용하는 폰트(DejaVu Sans)에는 한글 글리프가 없습니다. 한글 문자를 받으면 폰트가 표현할 수 없다는 의미로 네모(□)를 대신 출력합니다. OS에 설치된 한글 폰트를 명시적으로 지정해야 합니다.
OS별 한글 폰트 설정
운영체제마다 기본으로 설치된 한글 폰트 이름이 다릅니다. 아래 코드에서 자신의 환경에 맞는 폰트 이름을 선택하세요.
import matplotlib.pyplot as pltimport matplotlib.font_manager as fm# Windowsplt.rcParams['font.family'] = 'Malgun Gothic'# macOS# plt.rcParams['font.family'] = 'AppleGothic'# Linux (NanumGothic 사전 설치 필요)# plt.rcParams['font.family'] = 'NanumGothic'# 마이너스 부호 깨짐 방지 (모든 환경에서 필요)plt.rcParams['axes.unicode_minus'] = False
axes.unicode_minus를 False로 설정하지 않으면, 음수 값의 마이너스 기호(-1, -2 등)가 네모로 표시됩니다. 한글 폰트를 설정할 때 항상 함께 써주는 것이 좋습니다.
Linux에서 NanumGothic 설치
리눅스 환경이라면 먼저 폰트를 설치해야 합니다.
# Ubuntu/Debiansudo apt-get install fonts-nanum# 설치 후 폰트 캐시 갱신fc-cache -fv
폰트 설치 후 Python을 재시작하거나, 아래 명령으로 폰트 캐시를 강제로 삭제해야 반영됩니다.
import matplotlib.font_manager as fmfm._load_fontmanager(try_read_cache=False)
설정 확인
폰트 설정이 잘 됐는지 확인하는 코드입니다.
import seaborn as snsimport matplotlib.pyplot as plt# 한글 폰트 설정 (macOS 기준 예시)plt.rcParams['font.family'] = 'AppleGothic'plt.rcParams['axes.unicode_minus'] = Falsetips = sns.load_dataset("tips")ax = sns.scatterplot(data=tips, x="total_bill", y="tip")ax.set_title("계산서 금액과 팁의 관계")ax.set_xlabel("계산서 금액 (달러)")ax.set_ylabel("팁 (달러)")plt.show()
자주 나오는 오류와 해결법
오류: UserWarning: Glyph ... missing from font
폰트 이름이 올바르지 않거나, 해당 폰트가 설치되지 않은 경우 발생합니다. 아래 코드로 현재 시스템에서 사용 가능한 한글 폰트 목록을 확인할 수 있습니다.
import matplotlib.font_manager as fm# 시스템에 설치된 폰트 중 한글 지원 폰트 찾기fonts = [f.name for f in fm.fontManager.ttflist if 'Gothic' in f.name or 'Nanum' in f.name or 'Malgun' in f.name]print(sorted(set(fonts)))
오류: 그래프가 표시되지 않음
폰트 이름에 오타가 있으면 경고 없이 기본 폰트로 되돌아가는 경우가 있습니다. plt.rcParams['font.family']의 값을 위 목록에서 복사해서 사용하세요.
매번 설정하기 번거롭다면
매 파일마다 폰트 설정을 반복하기 싫다면, Matplotlib 설정 파일(matplotlibrc)에 영구적으로 저장할 수 있습니다. 하지만 협업 환경에서는 파일마다 명시적으로 설정하는 것이 다른 사람의 환경과 충돌을 피하는 더 안전한 방법입니다.