안수찬 블로그

python matplotlib 에서 한글 텍스트 표시하기

Introduction

안수찬 @dobestan

안수찬 @dobestan

서울대학교에서 컴퓨터공학을 전공하고, 오랜 기간 서비스 기획 및 개발을 해 왔습니다. 이러한 전문성을 인정받아 미래부 소프트웨어 마에스트로에 선정된 바 있습니다. 현재는 모바일 방송국, 퍼스트캔버스에서 컨텐츠로 새로운 가치를 그리고 있습니다. 나는 안수찬이다. 그러므로 나는 할 수 있다. me@ansuchan.com


python

python matplotlib 에서 한글 텍스트 표시하기

Posted by 안수찬 @dobestan on .
Featured

python

python matplotlib 에서 한글 텍스트 표시하기

Posted by 안수찬 @dobestan on .

파이썬에서 데이터 분석, 그 중에서도 데이터 시각화를 위한 도구들이 많이 있지만 내가 개인적으로 가장 많이 사용하는 도구는 단연코 Matplotlib 이다. 다만, 기본 설정으로 이용하다보면 matplotlib 기본 폰트로 설정되어, 한글이 깨지는 문제가 발생한다. 관련해서 수업이나 기업교육을 진행하다보면 항상 똑같은 질문이 들어와서 이번 기회에 포스트로 정리한다.

이번 글에서는 지난 글에서 다뤄봤던 "Pandas 에서 주가 데이터 가져오기 - 코스피 지수" 를 이용해서, 주가에 대한 그래프를 그리면서, 한글 텍스트가 깨지지 않도록 하는 방법에 대해서 살펴보겠다.

tl;dr

  • matplotlib.rc('font', family=font_name) 를 통해서 설정을 변경한다.
matplotlib.rc('font', family="NanumBarunGothicOTF")  
  • 혹은 matplotlibrc 파일을 변경해서 글로벌하게 변경한다.
# /Users/$USER/.matplotlib/matplotlibrc
# matplotlibrc 의 위치는 다를 수 있습니다.

font.family         : NanumBarunGothicOTF  

문제점

  • matplotlib 에서 기본 설정으로는 한글 표시가 되지 않아, 한글이 깨지는 문제가 발생한다. ( 기본 폰트: sans-serif )
x = np.arange(0, 1, 0.01)

plt.plot(  
    x,
    x ** 2,
    "r--",
)

plt.title("제목을 적어보자 | 안수찬의 개발이야기")  
Matplotlib 에서 한글이 표시되지 않는 이미지
한글이 표시되지 않는다.

기본 폰트의 경우에는 한글이 지원되지 않기 때문에 다음과 같이 깨지는 것을 확인할 수 있다.

해결하기 전에

  • matplotlib 는 크게 2가지 설정을 따릅니다.
    1. 동적인 rc 설정 ( Dynamic rc Settings; matplotlib.rcParams )
    2. 설정 파일 ( matplotlibrc )

matplotlib.rcParams 의 경우에는 코드 내에서 동적으로 수정해서 이용할 수 있고 ( dict ), matplotlibrc 는 설정 파일이니 파일 형태로 저장해두시면 됩니다.

>>> matplotlib.rcParams    # Dict-like variable
...

# 다음과 같이 현재의 기본 폰트 설정을 확인해볼 수 있다.
>>> matplotlib.rcParams["font.family"]
['sans-serif']

matplotlib 설정 파일의 경우에는 여러 위치에 있을 수 있는데, ( 현재 작업 디렉토리, matplotlib 설치 경로, 혹은 커스텀하게 입력된 PATH 등 ) 다음과 같이 현재 불러오고 있는 기본 rc 의 위치를 확인해볼 수 있다.

>>> matplotlib.matplotlib_fname()
'/Users/dobestan/.matplotlib/matplotlibrc'  
$ cat /Users/dobestan/.matplotlib/matplotlibrc

...
font.family         : sans-serif  
font.style          : normal  
font.variant        : normal  
font.weight         : medium  
font.stretch        : normal  
...

해결책 #1. 동적 rc 설정을 통해서 해결하기

이 방법은 매번 Jupyter Notebook 을 새롭게 실행할 때 마다 작업을 해주셔야 합니다.

현재 사용 가능한 폰트 목록을 살펴보자. 시스템에 굳이 설치된 폰트가 아니더라도, 다운로드 받은 경로를 넣으면 되니 너무 걱정하지 말자.

>>> import matplotlib.font_manager as fm
>>> fm.get_fontconfig_fonts()
{
    ...,
    '/Users/dobestan/Library/Fonts/윤고딕340.ttf': 1,
    '/Users/dobestan/Library/Fonts/윤고딕350.ttf': 1,
}

위에 처럼 맥의 경우에는 /Users/$USER/Library/Fonts/ 에 시스템 폰트가 설치되어 있고, 윈도우의 경우에는 C:\Windows\Font 를 살펴보면 된다. 동일하게 우분투의 경우에는 /usr/share/fonts 에서 살펴볼 수 있다.

이미 시스템에 설치된 폰트 ( 혹은 이미 다운로드 한 폰트 ) 를 다음과 같이 적용할 수 있다.

>>> font_location = "/Users/dobestan/Library/Fonts/NanumBarunGothicBold.otf"
>>> font_name = fm.FontProperties(fname=font_location).get_name()
>>> matplotlib.rc('font', family=font_name)

해결책 #2. matplotlibrc 를 통해서 해결하기

matplotlibrc 의 위치를 확인하고 파일을 변경하시면 됩니다.

>>> matplotlib.matplotlib_fname()
/Users/dobestan/.matplotlib/matplotlibrc
# /Users/dobestan/.matplotlib/matplotlibrc
font.family         : NanumBarunGothicOTF  

한글이 잘 표시되는지 확인해보자.

지난 번에 작성한 "Pandas 에서 주가 데이터 가져오기 - 코스피 지수" 의 내용을 참고해서, 데이터를 가져왔습니다.

from pandas_datareader import data

df = data.get_data_google("KRX:KOSPI", "2016-01-01")  
ax = df.Close.plot()

ax.set_title("2016년 코스피 지수 | 안수찬의 개발이야기")  
ax.text("2016-08-01", "1830", "한글이 너무 잘 입력된다.")  
Matplotlib 에서 한글 지원하기
Matplotlib 에서 한글 입력하기

한글이 지원되는 폰트의 경우 한글이 정상적으로 표시됨을 확인할 수 있다.

References

안수찬 @dobestan

안수찬 @dobestan

https://ansuchan.com/

서울대학교에서 컴퓨터공학을 전공하고, 오랜 기간 서비스 기획 및 개발을 해 왔습니다. 이러한 전문성을 인정받아 미래부 소프트웨어 마에스트로에 선정된 바 있습니다. 현재는 모바일 방송국, 퍼스트캔버스에서 컨텐츠로 새로운 가치를 그리고 있습니다. 나는 안수찬이다. 그러므로 나는 할 수 있다. me@ansuchan.com

View Comments...