Post

[Python] Matplotlib Font Settings

[Python] Matplotlib Font Settings

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()
1
2
3
4
5
6
7
8
9
10
11
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 을 일일히 해주지 않아도 된다.
1
2
3
4
5
6
7
8
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를 사용하는 방법도 있다.
1
2
3
4
5
6
7
8
9
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로 사용된다.
1
print(mpl.matplotlib_fname())
1
/Users/mljinsol/.pyenv/versions/3.10.0/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc
  • 해당 설정파일을 열어 font.family를 원하는 폰트로 설정해준다.
1
vi /Users/mljinsol/.pyenv/versions/3.10.0/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc
1
font.family : NanumGothicOTF
  • 이렇게 설정해두면 따로 matplotlib 사용할 때마다 한글폰트 설정을 해주는 번거로움이 없다.
1
2
3
4
5
plt.plot(data)
plt.title('MyTitle')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.show()


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

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

1
2
3
4
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)의 폰트를 확인하고 싶은 경우
1
font_list = fm.findSystemFonts(fontpaths=None, fontext='ttf')
  • 모든 폰트를 확인하고 싶은 경우
1
2
3
4
5
6
[f.name for f in fm.fontManager.ttflist]

# output
['STIXSizeOneSym',
 'cmr10',
 ...]
  • Nanum 이름이 들어간 폰트이름과 폰트경로 확인하기
1
2
3
4
5
6
7
[(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. 그래프에서 마이너스 폰트가 깨지는 문제 해결 코드

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


Reference

This post is licensed under CC BY 4.0 by the author.