Matplotlib: 폰트 기본 경로를 찾을 수 없을 때

발생일: 2018.09.22

키워드: Jupyter Notebook, 주피터 노트북, 한글 폰트, 한글 깨질 때, font_manager, fontManager, seaborn, custom font, 나눔고딕, Nanum Gothic, AppleGothic, Mac OS X, set matplotlib font directory

문제:
주피터 노트북에서 Matplotlib 이나 Seaborn 으로 차트를 그릴 때 한글이 깨지는 문제가 있다.
이상한 건, 기존엔 잘 그려지다가 갑자기 안된다는 것이다.

폰트 설정도 하고, rcParam도 설정하고, 캐시도 날려보고, 무려 재부팅도 했는데 안된다...
왜 그럴까?


해결책:

Matplotlib 모듈이 내 맥의 폰트 디렉토리를 제대로 찾지 못하는 것 같다.
정확한 원인은 모르겠지만, 커널이 실행된 후에 모듈을 업데이트하는 과정에서 뭔가 문제가 생겼나보다.

여튼, 아래와 같이 명시적으로 폰트 디렉토리를 설정해주는 방법으로 해결했다.

    from matplotlib import font_manager

    # 폰트 경로가 인식되지 않는 문제가 있다
    font_dirs = ['/Library/Fonts']
    font_files = font_manager.findSystemFonts(fontpaths=font_dirs)
    font_list = font_manager.createFontList(font_files)
    font_manager.fontManager.ttflist.extend(font_list)


font_dirs 변수 내에 있는 /Library/Fonts 는 맥의 기본 폰트 디렉토리이다.

별도로 설치한 폰트나 다른 디렉토리에 있는 폰트를 차트를 그리는데 사용하고 싶다면,
동일하게 font_dirs 디렉토리에 넣어두면 된다.
프로젝트 내에서 공통으로 사용하는 폰트라면, 폰트 ttf 파일을 리파지터리에 넣어두고 상대 경로로 지정해도 괜찮을 것 같다.

font_dirs 가 유효하지 않아도 워닝이가 경고가 발생하지 않는다.
스크립트가 여러 환경에서 실행된다면, 대상 OS의 유효한 폰트 디렉토리를 넣어둬도 괜찮을 것 같다.

난 주로 Seaborn 을 사용하고 있어서, 폰트는 아래와 같이 적용했다.

import seaborn as sns
...
sns.set(font='AppleGothic')


논의:

일반적으로 한글이 깨지는 건 기본으로 설정된 폰트에 한글이 없기 때문이다.
대부분 차트의 폰트를 바꾸는 방법으로 해결 가능하다.

----

내게 발생한 문제는 아니었는데, 주피터 노트북의 캐시가 문제가 되는 경우가 있다고 한다.
이 땐 주피터 노트북의 캐시를 삭제하고, 노트북을 다시 실행하면 해결된다고 한다.

캐시 디렉토리는 get_cachedir() 명령으로 확인할 수 있다.

import matplotlib as mpl
print(mpl.get_cachedir())  #--> '/Users/ohgyun/.matplotlib'

디렉토리엔 font 관련 JSON 파일 등이 있는데, 그냥 다 지우면 된다.ㅎㅎ

!rm -r {mpl.get_cachedir()}/*


참고로, 캐시를 지우지 않고도 폰트 매니저의 내부 메서드로 빌드할 수도 있다.

mpl.font_manager._rebuild()



참고:

커스텀 폰트 디렉토리 설정하기

폰트 설정에 대해 전반적으로 잘 설명해주는 강의

카테고리

분류 전체보기 (702)
About me. (6)
Daylogs (667)
비공개 (0)
영어공부 (0)
My works - 추억 (29)