Matplotlib 한글 폰트 설정하기

Matplotlib을 이용해 시각화하는 경우, 한글폰트가 깨져 나오는 경우가 있다.
이는 Matplotlib에 한글폰트가 설정되지 않았기 때문이다.
한글폰트를 설정하기 위한 3가지 방식이 있다.

  1. FontProperties 사용
  2. matplotlib.rcParams[]으로 전역글꼴 설정
  3. rcParams를 설정파일에 직접 설정 (Matplotlib의 default font를 한글 font로 설정하여 사용)


1. FontProperties 사용

  • 적용할 항목의 텍스트에 바로 폰트를 지정해주는 방식
    • 아래의 항목에 설정할 수 있다.
      • matplotlib.pyplot.title()
      • matplotlib.pyplot.xlabel()
      • matplotlib.pyplot.ylabel()
      • matplotlib.pyplot.legend()
      • matplotlib.pyplot.text()
      • matplotlib.axes.set_title()
import matplotlib.pyplot as plt


path = '/Users/mljinsol/Library/Fonts/NanumGothic.otf'
fontprop = fm.FontProperties(fname=path, size=20)

plt.plot(data)
plt.title('MyTitle', fontproperties=fontprop)
plt.xlabel('xlabel', fontproperties=fontprop)
plt.ylabel('ylabel', fontproperties=fontprop)
plt.show()


2. matplotlib.rcParams[]으로 전역글꼴 설정

  • 그래프에 바로 폰트를 설정하여 해당 그래프의 모든 텍스트에 (동일한) 폰트를 한 번에 적용하는 방식
  • 위의 1번과 다른 점은 fontproperties=fontprop 을 일일히 해주지 않아도 된다.
plt.rcParams['font.family'] = 'NanumGothicOTF'  # font.family: 설정되어 있는 폰트 글꼴
plt.rcParams['font.size'] = 20  # font.size: 설정되어 있는 폰트 사이즈

plt.plot(data)
plt.title('MyTitle')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.show()
  • rcParams 대신 FrontPropertiesplt.rc를 사용하는 방법도 있다.
path = '/Users/mljinsol/Library/Fonts/NanumGothic.otf'
font_name = fm.FontProperties(fname=path, size=20).get_name()  # NanumGothic
plt.rc('font', family=font_name)

plt.plot(data)
plt.title('MyTitle')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.show()


3. rcParams를 설정파일에 직접 설정

  • mpl.matplotlib_fname()을 통해 폰트설정파일 경로 확인 후, 해당 설정파일에 직접 폰트를 지정하는 방식. matplotlib의 설정파일에 폰트를 직접 설정하는 것이므로 컴퓨터를 껐다켜도 해당 폰트가 default로 사용된다.
print(mpl.matplotlib_fname())

# output
/Users/mljinsol/.pyenv/versions/3.10.0/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc
  • 해당 설정파일을 열어 font.family를 원하는 폰트로 설정해준다.
vi /Users/mljinsol/.pyenv/versions/3.10.0/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc
font.family : NanumGothicOTF
  • 이렇게 설정해두면 따로 matplotlib 사용할 때마다 한글폰트 설정을 해주는 번거로움이 없다.
plt.plot(data)
plt.title('MyTitle')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.show()


++ 추가로 함께 알아두어야 할 코드들!!

1. 설치된 Matplotlib의 버전과 위치정보 확인

print(mpl.__version)        # mpl version
print(mpl.__file__)         # mpl installed directory
print(mpl.get_configdir())  # mpl config directory
print(mpl.get_cachedir())   # mpl cache directory
  • 새로운 폰트를 설치 후 불러오지 못할 때 해결방법
    • 만약 새로운 폰트를 설치했는데 해당 폰트를 불러오지 못한다면, 터미널에서 mpl.get_cachedir()로 나타나는 캐시위치로 이동해서 캐시파일을 확인한다.
    • 캐시파일에 새로운 폰트가 나타나지 않는다면 캐시파일을 삭제 후 파이썬 파일을 다시 실행하면 캐시파일에 새로운 폰트가 저장된 것을 확인할 수 있다.


2. 설치된 폰트 확인

  • 특정 확장자(ex. ttf)의 폰트를 확인하고 싶은 경우
font_list = fm.findSystemFonts(fontpaths=None, fontext='ttf')
  • 모든 폰트를 확인하고 싶은 경우
[f.name for f in fm.fontManager.ttflist]

# output
['STIXSizeOneSym',
 'cmr10',
 ...]
  • Nanum 이름이 들어간 폰트이름과 폰트경로 확인하기
[(f.name, f.fname) for f in fm.fontManager.ttflist if 'Nanum' in f.name]

# output
[('NanumGothicOTF', '/Users/mljinsol/Library/Fonts/NanumGothicBold.otf'),
 ('NanumGothicOTF', '/Users/mljinsol/Library/Fonts/NanumGothic.otf'),
 ...
 ('NanumBarunpen', '/Users/mljinsol/Library/Fonts/NanumBarunpenB.ttf')]


3. 그래프에서 마이너스 폰트가 깨지는 문제 해결 코드

mpl.rcParams['axex.unicode_minus'] = False


Reference

Leave a comment