본문 바로가기
Python/matplotlib

[Python] Matplotlib Font설정 : 한글 사용하기 (colab).

by ds31x 2023. 7. 12.

현재 matplotlib가 사용하는 font의 family와 size 확인하기.

matplotlibrcParams (runtime config parameters)에서 확인 가능함.

import matplotlib as mpl

print(f"font.family: {mpl.rcParams['font.family']}"), 
print(f"font.size  : {mpl.rcParams['font.size']}")

 

2023.7.12 당시 colab의 경우, 다음과 같은 결과가 나옴.

font.family: ['sans-serif']
font.size  : 10.0

현재 matplotlib가 사용가능한 font들 확인하기.

matplotlibfont_manager를 통해 가능함.

import matplotlib.font_manager as fm  # to manage font

# font file들의 경로를 가지는 list 반환.
sys_fonts=fm.findSystemFonts() 
print(f"# of sys_font_family : {len(sys_fonts)}")
print(sys_fonts) 

# Debian, Ubuntu등에서 사용가능한 Nanum fonts 확인.
nanum_fonts = [f for f in sys_fonts if 'Nanum' in f]
print(f"# of nanum_font family: {len(nanum_fonts)}")
print(nanum_fonts) 

# 현재 FontEntry들을 출력 (ttf파일 기준)
ttf_fonts = fm.fontManager.ttflist
print(f"# of ttf_font entries: {len(ttf_fonts)}")
# for f in ttf_fonts:
#   print(f.name)

# 현재 Nanum font관련 FontEntry들을 출력 (ttf파일 기준)
nanum_font_entries = [f for f in ttf_fonts if 'Nanum' in f.name]
print(f"# of nanum ttf_font entries: {len(nanum_font_entries)}")
# for f in ttf_fonts:
  • colab의 경우, 기본적으로 한글 폰트를 설치해줘야 하며,
  • 위의 코드 수행시 설치된 nanum font의 갯수가 0으로 나오는게 정상임.

Ubuntu, Debian계열에서 nanum font설치하기.

apt update
apt install fonts-nanum*
  • Jupyter notebook에서 수행시 !를 앞에 추가해주어야함 (외부 명령어)
  • 일반적으로는 위의 명령어들을 sudo로 수행시켜야 하나, colab의 경우엔 sudo 없이 가능.

2023.7.12 당시, 31개의 nanum font들이 설치된다.

system에 nanum font들이 추가설치된 것이지,
matplotlib가 사용가능한 font entry로는 추가된 것이 아님.

https://dsaint31.tistory.com/entry/Linux-Debian-%EA%B3%84%EC%97%B4-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B4%80%EB%A6%AC-%ED%88%B4

 

[Linux] Debian 계열 패키지 관리 툴

apt (apt-get, apt-cache) apt는 Debian 계열의 Linux에서 패키지 관리 SW로서, 패키지관리시스템 의 High Level Command Line Interface 를 제공한다. 달리 말하면 apt-get과 apt-cache와 같은 APT tool을 보다 쉽게 사용할 수

dsaint31.tistory.com


한글 위한 FontEntry 생성 및 추가

앞서 matplotlib.font_managersys_fonts를 통해 얻은 한글을 지원하는 nanum font의 ttf 파일 경로를 토대로,
matplotlib.font_manager.FontProperties를 통해 ttf파일에 font 이름을 얻어내고,
이들을 바탕으로 matplotlib.font_manager.FontEntry 객체를 생성한 후,
생성된 FontEntry 객체를 matplotlib.font_manager.fontManager.ttflist에 추가해주면 된다.

# ttf 파일로부터 font 정보 얻기.
ttf_path = nanum_fonts[0]
font_name = fm.FontProperties(fname=ttf_path, size=10).get_name()

# FontEntry만들기
fe = fm.FontEntry(
    fname=ttf_path, # ttf 파일이 저장되어 있는 경로
    name=font_name  # font_name
)

# matplotlib에 font추가.
fm.fontManager.ttflist.append(fe) # Matplotlib에 폰트 추가
# fm.fontManager.ttflist.insert(0, fe)     
mpl.rcParams.update({'font.size': 18, 'font.family': font_name}) # 폰트 설정 (dict의 update임)
  • ttflist는 Python의 list이며, rcParams는 dictionary임.
  • rcParamsmatplotlib.pyplot을 통해서도 접근 가능.

Test

다음 코드는 간단하게 한글이 출력되는지를 확인 가능함.

import matplotlib.pyplot as plt
import numpy as np

data = np.arange(10,30,1)

plt.figure(figsize=(5,4))
plt.plot( data, 'ok')
plt.title('한글 테스트')
plt.ylabel('y축')
plt.xlabel('x축')
plt.show()

 

결과는 다음과 같음.

참고로, label에서 nanum font 사용시 minus기호가 깨진다.

이를 제대로 출력하기 위해선 다음의 설정이 필요하다.

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

gist url

https://gist.github.com/dsaint31x/537f27ec5506e7c539279a5c2c472405

 

py_matplotlib_korean_font_colab.ipynb

py_matplotlib_korean_font_colab.ipynb. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com


참고자료

matplotlib 버전이 올라가서 아래 url대로 하면 동작이 안된다. 하지만 기본적인 내용은 같으며 보다 자세한 설명인지 첨부한다. (font_manager._rebuild 에서 에러가 남.)

https://colab.research.google.com/github/nicewook/datascience_exercise/blob/master/korean_font_on_matplotlib.ipynb

 

korean_font_on_matplotlib.ipynb

Run, share, and edit Python notebooks

colab.research.google.com

 

local장비에서 특별히 설치 등을 하지 않고 처리할 때는 기존 한글 폰트를 사용하면 됨.

https://mydevjourney.tistory.com/79

 

[Python] Matplotlib Mac, Window 한글 깨짐

import matplotlib # windows의 경우 matplotlib.rcParams['font.family'] = 'Malgun Gothic' # mac의 경우 matplotlib.rcParams['font.family'] = 'AppleGothic' 다음의 코드를 운영체제에 맞게 실행해주면 해결된다.

mydevjourney.tistory.com

 

runtime config parameter들에 대한 참고 자료.

https://jrc-park.tistory.com/274

 

matplotlib의 구조와 rcParams에 대해 알면 나도 plot 고수 📈

Matplot의 구조 📈 데이터를 시각화 하기 위해서 Matplotlib을 자주 사용합니다. 대부분의 사용자들이 세부적인 구조를 알지 못해 디버깅을 하는데 많은 시간을 소요하게 됩니다. 이번 포스팅에서는

jrc-park.tistory.com