Matplotlib + 한글 (Windows 아나콘다)

Matplotlib + 한글 (Windows 아나콘다)

  • matplotlib 텍스트 출력시 폰트 특성을 지정 (FontProperties)
  • matplotlib 전역으로 한글 글꼴 지정(rcParams)
  • 사용가능한 폰트 확인, TTF 폰트 설치 방법

2018 FinanceData.KR http://fb.com/financedata

기본정보 확인

  • 운영체제 버전
  • 파이썬 버전
  • matplotlib 주요 설치 정보
In [1]:
# 실행중인 운영체제 확인

import platform
platform.platform()
Out[1]:
'Windows-8.1-6.3.9600-SP0'
In [2]:
# 파이썬 버전

import sys
sys.version_info
Out[2]:
sys.version_info(major=3, minor=6, micro=3, releaselevel='final', serial=0)
In [3]:
# matplotlib 주요 설치 정보

import matplotlib

print ('버전: ', matplotlib.__version__)
print ('설치위치: ', matplotlib.__file__)
print ('설정: ', matplotlib.get_configdir())
print ('캐시: ', matplotlib.get_cachedir())
버전:  2.1.0
설치위치:  C:\Users\Seung-June\Anaconda3\lib\site-packages\matplotlib\__init__.py
설정:  C:\Users\Seung-June\.matplotlib
캐시:  C:\Users\Seung-June\.matplotlib

matplotlib 기본 설정

In [4]:
%matplotlib inline
import matplotlib.pyplot as plt

plt.rcParams["axes.grid"] = True
plt.rcParams["figure.figsize"] = (14,4)

한글이 포함된 간단한 차트

In [5]:
import numpy as np
data = np.random.randint(-100, 100, 50).cumsum()
data
Out[5]:
array([   8,  -54, -109, -173, -101, -140, -103, -127, -122,  -64, -111,
        -70,  -54,  -18,  -12,   63,  154,   60,  102,   37,   51,  100,
        168,  178,  137,  189,  218,  140,  123,   50,    5,   26,  -21,
       -108, -146, -153, -210, -218, -228, -295, -352, -284, -264, -273,
       -223, -198, -135, -199, -256, -220], dtype=int32)
In [6]:
plt.plot(range(50), data, 'r')
plt.title('가격변동 추이')
plt.ylabel('가격')
Out[6]:
Text(0,0.5,'가격')

한글이 제대로 출력되지 않는 것을 확인할 수 있다

폰트를 지정하는 두가지 방법

matplotlib에서 폰트를 지정하여 출력하는 하는 대표적인 방법은 크기 두 가지

  1. 텍스트 출력시 폰트 특성을 지정: FontProperties 속성으로 폰트 속성을 지정
  2. 전역으로 지정: rcParams 을 사용하여 전역으로 설정값을 지정

텍스트 출력시 폰트 특성을 지정

텍스트를 출력하는 다음 함수들을 사용할 때, fontproperties 인자에 폰트를 지정할 수 있다.

matplotlib.pyplot

  • title()
  • xlabel()
  • ylabel()
  • legend()
  • text()

matplotlib.axes

  • set_title()

예를 들어, 다음과 같이 텍스트와 폰트를 지정하여 출력할 수 있다.

  • plt.text(0, 0, "Sample Text", fontproperties=fontprop)

무료 한글폰트

폰트 프로퍼티를 지정하여 사용

In [7]:
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

font_path = 'C:/Windows/Fonts/EBS훈민정음R.ttf'
fontprop = fm.FontProperties(fname=font_path, size=18)

plt.ylabel('가격', fontproperties=fontprop)
plt.title('가격변동 추이', fontproperties=fontprop)
plt.plot(range(50), data, 'r')
plt.show()

폰트를 각기 지정해서 사용하기

In [8]:
# TTF폰트 파일을 직접 지정하는 방법 (나눔 펜 글씨)

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

path_gothic = 'C:/Windows/Fonts/NanumMyeongjoExtraBold.ttf'
fontprop1 = fm.FontProperties(fname=path_gothic, size=20)

path_pen = 'C:/Windows/Fonts/NanumPen.ttf'
fontprop2 = fm.FontProperties(fname=path_pen, size=34)

plt.plot(range(50), data, 'r')
plt.ylabel('가격', fontproperties=fontprop1)
plt.title('가격변동 추이', fontproperties=fontprop2)
plt.show()

폰트가 항상 'C:/Windows/Fonts'에 있어야만 하는 것은 아니다.

ttf 폰트 파일을 복사해서 바로 사용할 수 도 있다. 현재 디렉토리에 malgun.ttf 파일을 복사하여 다음과 같이 ttf 파일을 지정하여 사용할 수 있다.

In [9]:
import matplotlib.font_manager as fm

fontprop = fm.FontProperties(fname="malgun.ttf", size=24)

plt.title('맑은고딕 제목', fontproperties=fontprop)
plt.plot(data)
plt.show()

전역 글꼴 설정: matplotlib.rcParams[]

matplotlib.rcParams을 통해 matplotlib의 다양한 설정값을 읽거나 지정할 수 있다.

https://matplotlib.org/users/customizing.html

In [10]:
# 기본 설정 읽기
import matplotlib.pyplot as plt

# size, family
print (plt.rcParams['font.size'] ) 
print (plt.rcParams['font.family'] )
10.0
['sans-serif']
In [11]:
# serif, sans-serif, monospace
print (plt.rcParams['font.serif']) 
print (plt.rcParams['font.sans-serif']) 
print (plt.rcParams['font.monospace']) 
['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']
['DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Serif', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avant Garde', 'sans-serif']
['DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Computer Modern Typewriter', 'Andale Mono', 'Nimbus Mono L', 'Courier New', 'Courier', 'Fixed', 'Terminal', 'monospace']

폰트의 기본값들을 다음과 같이 설정할 수 있다

In [12]:
import matplotlib.pyplot as plt

plt.rcParams["font.family"] = 'nanummyeongjo'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 24.
plt.rcParams['xtick.labelsize'] = 12.
plt.rcParams['ytick.labelsize'] = 12.
plt.rcParams['axes.labelsize'] = 20.

plt.title('가격의 변화')
plt.plot(range(50), data, 'r')
plt.show()

레이블에 '-'가 있는 경우 유니코드의 '-'문자를 그대로 출력하면 '-' 부호만 깨져 보인다. 이를 방지하기 위해 'axes.unicode_minus' 옵션을 False로 지정한다.

TTF 파일에서 font.family 이름 얻어 전역 설정

"font.family"에 지정할 이름을 .ttf 파일로 부터 얻을 수 있다

In [13]:
from matplotlib import font_manager

font_fname = 'C:/Windows/Fonts/NanumGothic.ttf'
font_family = font_manager.FontProperties(fname=font_fname).get_name()

print(font_family)
NanumGothic
In [14]:
import matplotlib.pyplot as plt
from matplotlib import font_manager

font_fname = 'C:/Windows/Fonts/NanumGothic.ttf'
font_family = font_manager.FontProperties(fname=font_fname).get_name()

plt.rcParams["font.family"] = font_family

matplotlib에 새로운 폰트를 추가하기

  1. .ttf 폰트를 matplotlib으로 복사한다
    (아나콘다를 사용하는 경우 보통 아래 디렉토리이다. Seung-June는 사용자 이름)
    C:\Users\Seung-June\Anaconda3\Lib\site-packages\matplotlib\mpl-data\fonts\ttffonts\ttf
    
  2. matplotlib cache 폴더의 내용 삭제한다
  3. 커널 재시작(주피터 노트북 재시작)

(참고) 시스템에 설치된 글꼴 확인

In [15]:
# 사용가능한 시스템의 TTF 폰트 목록
import matplotlib.font_manager as font_manager

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

print('사용가능한 TTF 폰트 개수:', len(font_list))
font_list[:10] # 목록에서 처음 10 개만 보기
사용가능한 TTF 폰트 개수: 889
Out[15]:
['C:\\Windows\\Fonts\\tradbdo.ttf',
 'c:\\windows\\fonts\\tunga.ttf',
 'C:\\Windows\\Fonts\\upcfb.ttf',
 'C:\\Windows\\Fonts\\BOOKOS.TTF',
 'C:\\Windows\\Fonts\\ENPKAV.TTF',
 'C:\\Windows\\Fonts\\HMKMS.TTF',
 'C:\\Windows\\Fonts\\msyi.ttf',
 'c:\\windows\\fonts\\ebs훈민정음r.ttf',
 'c:\\windows\\fonts\\ens721li.ttf',
 'C:\\Windows\\Fonts\\vrinda.ttf']
In [16]:
# 참고) matplotlib cache 위치를  확인하는 방법

matplotlib.get_cachedir()
Out[16]:
'C:\\Users\\Seung-June\\.matplotlib'
In [17]:
# matplotlib 설정 파일의 위치

matplotlib.matplotlib_fname()
Out[17]:
'C:\\Users\\Seung-June\\Anaconda3\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc'

댓글