matplotlib + 한글 (Ubuntu Linux)
matplotlib + 한글 (Ubuntu Linux)¶
- 사용가능한 폰트 확인, TTF 폰트 설치 방법
- matplotlib 텍스트 출력시 폰트 특성을 지정 (FontProperties)
- matplotlib 전역으로 한글 글꼴 지정(rcParams)
2017 FinanceData http://facebook.com/financedata¶
%matplotlib inline
기본정보 확인¶
# 실행중인 운영체제 확인
import platform
platform.platform()
# 파이썬 버전
import sys
sys.version_info
# matplotlib 주요 설치 정보
import matplotlib
print ('버전: ', matplotlib.__version__)
print ('설치위치: ', matplotlib.__file__)
print ('설정: ', matplotlib.get_configdir())
print ('캐시: ', matplotlib.get_cachedir())
한글이 포함된 간단한 차트¶
import numpy as np
data = np.random.randint(-100, 100, 50).cumsum()
data
import matplotlib.pyplot as plt
plt.plot(range(50), data, 'r')
plt.title('가격변동 추이')
plt.ylabel('가격')
plt.show()
한글이 제대로 표시되지 않는다. 한글 폰트가 설치되어 있지 않거나, 한글 폰트를 사용하도록 설정되어 있지 않은 경우이다.
우분투에 폰트는 /usr/share/fonts/ 디렉토리에 있다.
ls -l /usr/share/fonts/
ls -l /usr/share/fonts/truetype/
글꼴 설치¶
2012년 부터 우분투에는 나눔글꼴이 기본 포함되어 있다.
만일, 나눔 글꼴이 설치되어 있지 않다면 다음과 같이 설치할 수 있으며, 다른 ttf 폰트도 /usr/share/fonts/ 폴더에 복사하여 사용할 수 있다.
나눔 글꼴 설치¶
apt-get 명령으로 나눔글꼴(fonts-nanum)을 설치하고, fc-cache 명령으로 폰트 캐시 삭제
$ sudo apt-get install fonts-nanum*
$ sudo fc-cache -fv
만일 다른 ttf 폰트를 가져왔다면 다음과 같이 복사하고, fc-cache 명령으로 폰트 캐시 삭제
$ sudo cp new_font.ttf /usr/share/fonts/
$ sudo fc-cache -fv
matplotlib 나눔 글꼴을 추가¶
나눔 글꼴을 matplotlib 에 복사하고, matplotlib의 폰트 캐시를 삭제
$ sudo cp /usr/share/fonts/truetype/nanum/Nanum* /usr/local/lib/python3.4/dist-packages/matplotlib/mpl-data/fonts/ttf/
$ rm -rf /home/ubuntu/.cache/matplotlib/*
나눔(nanum) 글꼴이 설치된 것을 확인
ls -l /usr/share/fonts/truetype/
ls -l /usr/share/fonts/truetype/nanum/
사용 가능한 ttf 폰트 목록¶
사용가능한 ttf(true type font)폰트 목록은 다음 리스트로 간단하게 얻을 수 있다
matplotlib.font_manager.fontManager.ttflist
import matplotlib
import matplotlib.font_manager
[f.fname for f in matplotlib.font_manager.fontManager.ttflist]
사용가능한 폰트 목록 중 나눔글꼴(이름에 'Nanum'이 포함된) 폰트 목록만 추출
import matplotlib
import matplotlib.font_manager
[f.name for f in matplotlib.font_manager.fontManager.ttflist if 'Nanum' in f.name]
[(f.name, f.fname) for f in matplotlib.font_manager.fontManager.ttflist if 'Nanum' in f.name]
폰트를 지정하는 두가지 방법¶
matplotlib에서 폰트를 지정하여 출력하는 하는 대표적인 방법은 크기 두 가지이다.
- 텍스트 출력시 폰트 특성을 지정: FontProperties 속성으로 폰트 속성을 지정
- 전역으로 지정: rcParams 을 사용하여 전역으로 설정값을 지정
텍스트 출력시 폰트 특성을 지정¶
텍스트를 출력하는 다음 함수들을 사용할 때, fontproperties 인자에 폰트를 지정할 수 있다.
matplotlib.pyplot
- title()
- xlabel()
- ylabel()
- legend()
- text()
matplotlib.axes
- set_title()
예를 들어, 다음과 같이 텍스트와 폰트를 지정하여 출력할 수 있다.
- plt.text(0, 0, "Sample Text", fontproperties=fontprop)
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
path = '/usr/share/fonts/truetype/nanum/NanumMyeongjo.ttf'
fontprop = fm.FontProperties(fname=path, size=18)
plt.plot(range(50), data, 'r')
plt.title('가격변동 추이', fontproperties=fontprop)
plt.ylabel('가격', fontproperties=fontprop)
plt.show()
# TTF폰트 파일을 직접 지정하는 방법 (나눔 펜 글씨)
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
path_gothic = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'
fontprop1 = fm.FontProperties(fname=path_gothic, size=20)
path_pen = '/usr/share/fonts/truetype/nanum/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()
path = '/usr/share/fonts/truetype/nanum/NanumGothic_Coding.ttf'
prop = fm.FontProperties(fname=path, size=18)
fig, ax = plt.subplots()
ax.plot(data)
ax.set_title('가격 변화 (나눔고딕코딩)', fontproperties=prop)
plt.show()
폰트가 항상 '/usr/share/fonts'에 있어야 하는 것은 아니다.
ttf 폰트 파일을 복사해서 바로 사용할 수 도 있다. 현재 디렉토리에 MalgunGothic.ttf 파일을 복사하여 다음과 같이 ttf 파일을 지정하여 사용할 수 있다.
ll MalgunGothic.ttf
import matplotlib.font_manager as fm
fontprop = fm.FontProperties(fname="./MalgunGothic.ttf", size=24)
plt.title('맑은고딕 제목', fontproperties=fontprop)
plt.plot(data)
plt.show()
전역 글꼴 설정: matplotlib.rcParams[]¶
matplotlib.rcParams을 통해 matplotlib의 다양한 설정값을 읽거나 지정할 수 있다.
# 기본 설정 읽기
import matplotlib.pyplot as plt
# size, family
print (plt.rcParams['font.size'] )
print (plt.rcParams['font.family'] )
# serif, sans-serif, monospace
print (plt.rcParams['font.serif'])
print (plt.rcParams['font.sans-serif'])
print (plt.rcParams['font.monospace'])
폰트의 기본값들을 다음과 같이 설정할 수 있다
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = 'NanumGothicCoding'
plt.rcParams['font.size'] = 12.
plt.rcParams['xtick.labelsize'] = 24.
plt.rcParams['ytick.labelsize'] = 24.
plt.rcParams['axes.labelsize'] = 20.
plt.title('가격의 변화')
plt.plot(range(50), data, 'r')
plt.show()
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = 'NanumGothicCoding'
plt.rcParams["font.size"] = 12
plt.rcParams["figure.figsize"] = (14,4)
plt.title('가격의 변화')
plt.plot(range(50), data, 'r')
plt.show()
레이블에 '-'가 있는 경우 유니코드의 '-'문자를 그대로 출력하면 '-' 부호만 깨져 보인다. 이를 방지하기 위해 'axes.unicode_minus' 옵션을 False로 지정한다.
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = 'NanumGothicCoding'
plt.rcParams["font.size"] = 12
plt.rcParams['xtick.labelsize'] = 12.
plt.rcParams['ytick.labelsize'] = 12.
plt.rcParams["figure.figsize"] = (14,4)
plt.rcParams['axes.grid'] = True
plt.rcParams['axes.unicode_minus'] = False
plt.title('가격의 변화')
plt.plot(range(50), data, 'r')
plt.show()
ttf 파일에서 폰트 이름 얻어 전역 설정¶
"font.family"에 지정할 이름을 .ttf 파일로 부터 얻을 수 있다
from matplotlib import font_manager, rc
font_fname = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'
font_name = font_manager.FontProperties(fname=font_fname).get_name()
rc('font', family=font_name)
print(font_name)
(참고) 시스템에 설치된 글꼴 확인¶
우분투에 설치되어 있는 글꼴 목록은 fc-list 명령어로 볼 수 있다.
# 전체 글꼴(460여개)중 처음 10개만 출력
! fc-list | head -10
# 한글 글꼴만 보려면 ':lang=ko' 옵션을 지정
# 한글 글꼴 전체(약 50여개)에서 .ttf 만 출력
! fc-list :lang=ko | grep ttf
참고¶
# 사용가능한 시스템의 TTF 폰트 목록
import matplotlib.font_manager as font_manager
font_list = font_manager.findSystemFonts(fontpaths=None, fontext='ttf')
print(len(font_list))
font_list
# matplotlib 설정 파일의 위치
matplotlib.matplotlib_fname()
# 캐쉬 디렉토리
matplotlib.get_cachedir()
댓글
Comments powered by Disqus