Matplotlib에서 한글 폰트 사용하기

Matplotlib 한글폰트 사용하기

1. 필요한 패키지를 가져옵니다.

# 그래프를 노트북 안에 그리기 위해 설정
%matplotlib inline

# 필요한 패키지와 라이브러리를 가져옴
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False

2. 그래프를 그리기 위해 임의의 데이터를 만들어 줍니다.

import numpy as np

data = np.random.randint(-100, 100, 50).cumsum()
data

array([ 85, 150, 138, 216, 216, 193, 199, 248, 197, 144, 95, 188, 199,
164, 106, 153, 154, 188, 156, 200, 294, 323, 245, 321, 298, 299,
346, 323, 223, 304, 318, 236, 233, 291, 335, 378, 361, 401, 412,
360, 344, 326, 391, 356, 363, 309, 328, 283, 285, 341])

3. 기본 폰트로 지정되었기 때문에 한글이 깨져 나옵니다.

plt.plot(range(50), data, 'r')
mpl.rcParams['axes.unicode_minus'] = False
plt.title('시간별 가격 추이')
plt.ylabel('주식 가격')
plt.xlabel('시간(분)')

Text(0.5,0,'시간(분)')

png

4. 폰트를 설정해 주기에 앞서 설치된 matplotlib 의 버전과 위치 정보를 가져옵니다.

print ('버전: ', mpl.__version__)
print ('설치 위치: ', mpl.__file__)
print ('설정 위치: ', mpl.get_configdir())
print ('캐시 위치: ', mpl.get_cachedir())

버전: 2.1.0
설치 위치: /Users/corazzon/codes/jupyter/lib/python3.6/site-packages/matplotlib/init.py
설정 위치: /Users/corazzon/.matplotlib
캐시 위치: /Users/corazzon/.matplotlib

5. matplotlib의 위치 정보를 알았으니 터미널을 이용해 해당 위치로 가봅니다.

print ('설정 파일 위치: ', mpl.matplotlib_fname())

설정 파일 위치: /Users/corazzon/codes/jupyter/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc

6. 설치된 폰트를 찍어 봅니다.

font_list = fm.findSystemFonts(fontpaths=None, fontext='ttf')

# ttf 폰트 전체개수
print(len(font_list))

197

# OSX의 설치된 폰트를 가져오는 함수
font_list_mac = fm.OSXInstalledFonts()
print(len(font_list_mac))

197

# 시스템 폰트에서 읽어온 리스트에서 상위 10개만 출력
font_list[:10]

['/Library/Fonts/Gurmukhi.ttf',
'/System/Library/Fonts/SFCompactText-SemiboldItalic.otf',
'/System/Library/Fonts/SFCompactDisplay-Medium.otf',
'/Library/Fonts/NanumMyeongjo.otf',
'/Library/Fonts/NanumSquareRoundOTFL.otf',
'/System/Library/Fonts/SFCompactDisplay-Semibold.otf',
'/Library/Fonts/Arial Narrow Bold Italic.ttf',
'/Library/Fonts/STIXNonUniBol.otf',
'/Library/Fonts/STIXIntUpSmReg.otf',
'/System/Library/Fonts/ZapfDingbats.ttf']

f = [f.name for f in fm.fontManager.ttflist]
print(len(font_list))
# 10개의 폰트 명 만 출력
f[:10]

197

['DejaVu Sans',
'DejaVu Sans',
'DejaVu Serif',
'STIXSizeFiveSym',
'STIXSizeFourSym',
'STIXSizeTwoSym',
'STIXSizeFourSym',
'DejaVu Sans Mono',
'DejaVu Serif Display',
'STIXGeneral']

# [f.name for f in fm.fontManager.ttflist if '' in f.name]

7. 나눔 고딕을 사용할 예정이기 때문에 이름에 'Nanum'이 들어간 폰트만 가져와 봅니다.

  • 폰트를 설치했는데 원하는 폰트 명을 가져오지 못 할 때, 터미널을 열어 mpl.get_cachedir()로 찍히는 캐시 위치로 이동해서 캐시 파일을 열어봅니다.
  • 캐시 파일에 원하는 폰트리스트가 없으면 주피터 노트북 혹은 콘다를 재실행 해줍니다.
[(f.name, f.fname) for f in fm.fontManager.ttflist if 'Nanum' in f.name]

[('NanumGothicOTF', '/Library/Fonts/NanumGothic.otf'),
('NanumBarunGothicOTF', '/Library/Fonts/NanumBarunGothicUltraLight.otf'),
('NanumSquareRoundOTF', '/Library/Fonts/NanumSquareRoundOTFEB.otf'),
('NanumBarunGothicOTF', '/Library/Fonts/NanumBarunGothicLight.otf'),
('NanumBarunpen', '/Library/Fonts/NanumBarunpenBold.otf'),
('NanumBarunGothic', '/Library/Fonts/NanumBarunGothicLight.ttf'),
('Nanum Brush Script OTF', '/Library/Fonts/NanumBrush.otf'),
('NanumSquareRoundOTF', '/Library/Fonts/NanumSquareRoundOTFR.otf'),
('NanumMyeongjoOTF', '/Library/Fonts/NanumMyeongjoBold.otf'),
('Nanum Pen Script OTF', '/Library/Fonts/NanumPen.otf'),
('NanumBarunpen', '/Library/Fonts/NanumBarunpenRegular.otf'),
('NanumSquareOTF', '/Library/Fonts/NanumSquareOTFExtraBold.otf'),
('NanumBarunGothicOTF', '/Library/Fonts/NanumBarunGothic.otf'),
('NanumGothicOTF', '/Library/Fonts/NanumGothicLight.otf'),
('NanumBarunGothicOTF', '/Library/Fonts/NanumBarunGothicBold.otf'),
('NanumGothicOTF', '/Library/Fonts/NanumGothicExtraBold.otf'),
('NanumMyeongjoOTF', '/Library/Fonts/NanumMyeongjo.otf'),
('NanumSquareRoundOTF', '/Library/Fonts/NanumSquareRoundOTFB.otf'),
('NanumSquareOTF', '/Library/Fonts/NanumSquareOTFBold.otf'),
('NanumSquareOTF', '/Library/Fonts/NanumSquareOTFLight.otf'),
('NanumMyeongjoOTF', '/Library/Fonts/NanumMyeongjoExtraBold.otf'),
('NanumSquareRoundOTF', '/Library/Fonts/NanumSquareRoundOTFL.otf'),
('NanumGothicOTF', '/Library/Fonts/NanumGothicBold.otf'),
('NanumSquareOTF', '/Library/Fonts/NanumSquareOTFRegular.otf'),
('NanumBarunGothic', '/Library/Fonts/NanumBarunGothicUltraLight.ttf'),
('NanumBarunGothic', '/Library/Fonts/NanumBarunGothicBold.ttf'),
('NanumBarunGothic', '/Library/Fonts/NanumBarunGothic.ttf')]

9. 폰트를 사용하는 방법은 3가지가 있습니다.

1) FontProperties 를 사용하는 방법 - 그래프의 폰트가 필요한 항목마다 지정해 주어야 합니다.
2) matplotlib.rcParams[]으로 전역 글꼴 설정 방법 - 그래프에 설정을 해주면 폰트가 필요한 항목에 적용됩니다.
3) 2)번의 방법을 mpl.matplotlib_fname()로 읽어지는 설정 파일에 직접 적어주는 방법, 단 모든 노트북에 적용됩니다. 노트북을 열 때마다 지정해 주지 않아도 돼서 편리합니다.

1) FontProperties 를 사용하는 방법

  • 텍스트를 지정하는 항목에 지정해 사용할 수 있습니다. 지정해 준 항목에만 해당 폰트가 적용 됩니다.
  • matplotlib.pyplot

    • title()
    • xlabel()
    • ylabel()
    • legend()
    • text()
  • matplotlib.axes

    • set_title()
# fname 옵션을 사용하는 방법
path = '/Library/Fonts/NanumBarunpenRegular.otf'
fontprop = fm.FontProperties(fname=path, size=18)

plt.plot(range(50), data, 'r')
plt.title('시간별 가격 추이', fontproperties=fontprop)
plt.ylabel('주식 가격', fontproperties=fontprop)
plt.xlabel('시간(분)', fontproperties=fontprop)
plt.show()

png

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

# 기본 설정 읽기
import matplotlib.pyplot as plt

# size, family
print('# 설정되어있는 폰트 사이즈')
print (plt.rcParams['font.size'] ) 
print('# 설정되어있는 폰트 글꼴')
print (plt.rcParams['font.family'] )

# 설정되어있는 폰트 사이즈
10.0
# 설정되어있는 폰트 글꼴
['sans-serif']

# serif, sans-serif, monospace
print('serif 세리프가 있는 폰트--------')
print (plt.rcParams['font.serif']) 
print('sans-serif 세리프가 없는 폰트 --------')
print (plt.rcParams['font.sans-serif']) 
print('monospace 고정폭 글꼴--------')
print (plt.rcParams['font.monospace'])

serif 세리프가 있는 폰트--------
['DejaVu Serif', 'Bitstream Vera Serif', 'Computer Modern Roman', 'New Century Schoolbook', 'Century Schoolbook L', 'Utopia', 'ITC Bookman', 'Bookman', 'Nimbus Roman No9 L', 'Times New Roman', 'Times', 'Palatino', 'Charter', 'serif']
sans-serif 세리프가 없는 폰트 --------
['DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Serif', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avant Garde', 'sans-serif']
monospace 고정폭 글꼴--------
['DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Computer Modern Typewriter', 'Andale Mono', 'Nimbus Mono L', 'Courier New', 'Courier', 'Fixed', 'Terminal', 'monospace']

plt.rcParams["font.family"] = 'Nanum Brush Script OTF'
plt.rcParams["font.size"] = 20
plt.rcParams["figure.figsize"] = (14,4)
plt.plot(range(50), data, 'r')
plt.title('시간별 가격 추이')
plt.ylabel('주식 가격')
plt.xlabel('시간(분)')
plt.style.use('seaborn-pastel')
plt.show()

png

rcParams 대신 FontProperties 와 plt.rc 를 사용하는 방법

path = '/Library/Fonts/NanumBarunGothic.ttf'
font_name = fm.FontProperties(fname=path, size=50).get_name()
print(font_name)
plt.rc('font', family=font_name)

fig, ax = plt.subplots()
ax.plot(data)
ax.set_title('시간별 가격 추이')
plt.ylabel('주식 가격')
plt.xlabel('시간(분)')
plt.style.use('ggplot')
plt.show()

NanumBarunGothic

png

3) rcParams 를 설정 파일에 직접 적어주는 방법 - 모든 노트북에 공통적용

  • font.family : NanumGothicOTF
  • 이 외에 자주 사용하는 설정도 함께 해주면 편리합니다.
  • 이곳에 폰트를 지정해 주면 노트북을 실행할 때 바로 로드되도록 설정할 수 있습니다.
print ('설정 파일 위치: ', mpl.matplotlib_fname())

설정 파일 위치: /Users/corazzon/codes/jupyter/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc

# import matplotlib.pyplot as plt
# import numpy as np

fig, ax = plt.subplots()
ax.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')
ax.set_title('숫자 분포도 보기')
plt.show()

png

참고 URL :