우분투에서 matplotlib을 이용하여 그래프를 그릴 때, 한글 폰트를 사용하면 아래와 같이 한글이 깨져서 나온다.
matplotlib에서 한글 폰트를 사용하는 방법은 3가지가 있다.
만약 위의 방법을 사용하고 싶다면 여기에 설명이 자세히 나와 있으니 참고하면 된다.
그러나 나는 matplotlib을 사용할 때마다 폰트를 지정하는 것이 번거롭다고 생각해서 rcParams를 설정파일에 직접 적어주는 방법을 사용하고 싶었다. 그 방법은 다음과 같다.
먼저 터미널을 킨다.
nunum 폰트를 설치하고 캐시를 제거한다. (우분투에는 2012년부터 nanum 폰트가 설치되어 있다는 이야기가 있다. 그러나 만약 폰트가 설치되지 않았다면 아래의 방법으로 설치한다.)
$ sudo sudo apt-get install fonts-nanum*
$ sudo fc-cache -fv
nanum 폰트가 설치되어 있어 있는지 확인하고 싶다면 쥬피터 노트북에서 아래의 코드를 각각 실행해본다.
ls -l /usr/share/fonts/truetype/ ls -l /usr/share/fonts/truetype/nanum/
$ echo 'font.family : NanumMyeongjo' >> ~/.config/matplotlib/matplotlibrc
$ echo 'font.size : 15.0' >> ~/.config/matplotlib/matplotlibrc
원하는 글꼴 이름은 다음과 같이 찾을 수 있다.
import matplotlib.font_manager [f.name for f in matplotlib.font_manager.fontManager.ttflist if 'Nanum' in f.name]
$ cat ~/.config/matplotlib/matplotlibrc
print(plt.rcParams['font.family'] )
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 8))
plt.title("한글설정이 잘되었는지?")
plt.show()
그런데 나의 경우에는 6번을 실행하면 'Font family [] not found. Falling back to DejaVu Sans'라는 경고문이 뜨면서 한글 폰트가 여전히 깨져서 나왔다. 이 문제를 해결하기 위해서 수많은 블로그를 돌아다니다가 왜 이렇게 되는지 이유와 그 해결 방법을 찾을 수 있었다.
from matplotlib import font_manager
for i in font_manager.fontManager.ttflist:
if 'Nanum' in i.name:
print(i.name, i.fname)
결과가 '[]'로 나온다면 Nanum 폰트 목록을 제대로 받아오지 못하는 것이다.
import matplotlib
matplotlib.font_manager._rebuild()
2번의 코드 1줄을 써주었더니 바로 한글 폰트가 나왔다. 위의 코드는 폰트를 관리하는 json 파일을 업데이트해주는 것이다. 즉 나의 경우에는 폰트를 관리하는 json 파일이 제대로 업데이트되지 않아서 Nanum 폰트 목록을 받아오지 못했던 것이다.
한글 폰트 깨짐 문제로 한동안 고생했다. 하지만 이제 방법을 알았으니 같은 문제가 발생하면 바로 해결할 수 있다.
참고한 사이트:
matplotlib + 한글 (Ubuntu Linux)
우분투 18.04에서 파이썬 matplotlib 한글설정 방법
pandas, matplotlib에서 글꼴을 불러오지 못할 때