🔥알림🔥
① 테디노트 유튜브 - 구경하러 가기!
② LangChain 한국어 튜토리얼 바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs) 바로가기 🙌

2 분 소요

이번 포스팅에서는 matplotlib 에서 누락된 폰트를 추가 하는 방법에 대해 알아보겠습니다. 만약 설치된 폰트가 matplotlib 에서 사용할 수 없다면, 아래의 가이드를 따라 진행해 보시기 바랍니다.

👀 설치된 폰트 목록 확인

① 필요한 모듈 import

from IPython.core.display import HTML
import matplotlib
from matplotlib import font_manager
import shutil

② Matplotlib 캐시 삭제

print(f'캐시 디렉토리: {matplotlib.get_cachedir()}')
shutil.rmtree(matplotlib.get_cachedir())
캐시 디렉토리: /Users/teddy/.matplotlib

③ 사용가능 폰트 목록 확인

# 설치된 폰트 리스트 출력
sorted([font.name for font in font_manager.fontManager.ttflist])
['.Aqua Kana',
 '.Keyboard',
 '.New York',
 '.New York',
 '.SF Arabic',
 '.SF Arabic Rounded',
 '.SF Compact',
 (중간 생략...)
 'cmex10',
 'cmmi10',
 'cmr10',
 'cmss10',
 'cmsy10',
 'monofur for Powerline',
 'monofur for Powerline']

④ 설치된 폰트 목록과 폰트 스타일 확인

# 폰트명과 폰트스타일을 출력합니다.
def make_html(fontname):
    return "<p>{font}: <span style='font-family:{font}; font-size: 24px;'>{font}</p>".format(font=fontname)

code = "\n".join([make_html(font) for font in sorted(set([f.name for f in matplotlib.font_manager.fontManager.ttflist]))])

HTML("<div style='column-count: 2;'>{}</div>".format(code))

출력 예시

Capture-20230718-001226

🔥 [해결책] 설치한 폰트가 리스트에 없을 때❗️ 추가하는 방법

① matplotlib 폰트 관리자의 목록 출력

# Font 디렉토리 목록을 출력합니다.
font_dirs = font_manager.OSXFontDirectories
font_dirs
['/Library/Fonts/',
 '/Network/Library/Fonts/',
 '/System/Library/Fonts/',
 '/opt/local/share/fonts',
 '/Users/teddy/Library/Fonts']

② 폰트 디렉토리에서 설치하고자 하는 폰트 폴더 확인

폰트관리자의 폰트 목록(디렉토리) 중, 내가 설치하고자 하는 폰트를 포함하는 디렉토리 를 찾습니다.

# 각 디렉토리를 확인하여 설치하고자 하는 폰트의 경로 확인
for idx, f_dir in enumerate(font_dirs):
    print(f'==='*10)
    print(f'인덱스 [{idx}] \t위치: {f_dir}')
    font_list = font_manager.findSystemFonts(fontpaths=f_dir, fontext='ttf')
    print(sorted(font_list))
    print(f'==='*10)
==============================
인덱스 [0] 	위치: /Library/Fonts/
['/Library/Fonts/Arial Unicode.ttf', '/Library/Fonts/D2Coding-Ver1.3.2-20180524-all.ttc', (중간 생략...), '/Library/Fonts/NotoSansKR-Medium.otf', '/Library/Fonts/NotoSansKR-Regular.otf', '/Library/Fonts/NotoSansKR-Thin.otf', '/Library/Fonts/RIDIBatang.otf']
==============================
==============================
인덱스 [1] 	위치: /Network/Library/Fonts/
[]
==============================
==============================
인덱스 [2] 	위치: /System/Library/Fonts/
['/System/Library/Fonts/Apple Braille Outline 6 Dot.ttf', '/System/Library/Fonts/Apple Braille Outline 8 Dot.ttf', '/System/Library/Fonts/Apple Braille Pinpoint 6 Dot.ttf', '/System/Library/Fonts/Apple Braille Pinpoint 8 Dot.ttf', (중간 생략...) '/System/Library/Fonts/Supplemental/Times New Roman Italic.ttf',]
==============================
==============================
인덱스 [3] 	위치: /opt/local/share/fonts
[]
==============================
==============================
인덱스 [4] 	위치: /Users/teddy/Library/Fonts
['/Users/teddy/Library/Fonts/3270Medium.ttf', '/Users/teddy/Library/Fonts/FiraCode-Bold.ttf', '/Users/teddy/Library/Fonts/FiraCode-Light.ttf', '/Users/teddy/Library/Fonts/FiraCode-Medium.ttf', '/Users/teddy/Library/Fonts/FiraCode-Regular.ttf', '/Users/teddy/Library/Fonts/FiraCode-Retina.ttf', '/Users/teddy/Library/Fonts/FiraCode-SemiBold.ttf', '/Users/teddy/Library/Fonts/FuraMono-Bold Powerline.otf', '/Users/teddy/Library/Fonts/FuraMono-Medium Powerline.otf',]
==============================

아래는 FiraCode 라는 폰트의 위치를 찾은 결과 입니다.

  • font_dirs[4] 위치인 /Users/teddy/Library/Fonts 에서 찾을 수 있었습니다 ✌️
# FiraCode 의 위치 재확인
font_files = font_manager.findSystemFonts(fontpaths=font_dirs[4]) # font_dirs[4] 안에 위치한 FiraCode 확인
font_files = [f for f in font_files if 'Fira' in f]
font_files
['/Users/teddy/Library/Fonts/FiraCode-Regular.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-SemiBold.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-Bold.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-Retina.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-Medium.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-Light.ttf']

③ 추가할 폰트 목록을 선정

# 추려낸 폰트 목록 재확인
font_files
['/Users/teddy/Library/Fonts/FiraCode-Regular.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-SemiBold.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-Bold.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-Retina.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-Medium.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-Light.ttf']

혹시 사용하지 않는 폰트가 있다면, list 에서 미리 제거합니다.

font_files.pop(5) # 5번 인덱스 폰트는 제외
font_files
['/Users/teddy/Library/Fonts/FiraCode-Regular.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-SemiBold.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-Bold.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-Retina.ttf',
 '/Users/teddy/Library/Fonts/FiraCode-Medium.ttf']

④ 폰트 업데이트

# FiraCode 폰트 추가
for font in font_files:
    font_manager.fontManager.addfont(font)
    prop = font_manager.FontProperties(fname=font)

아래 코드를 실행하여 정상 추가되었는지 확인합니다.

# 설치된 폰트 리스트 출력
sorted([font.name for font in font_manager.fontManager.ttflist])
['Academy Engraved LET',
 'Al Bayan',
 'Al Nile',
 'Al Tarikh',
 'American Typewriter',
 'Andale Mono',
 'Anonymous Pro for Powerline',
 (중간 생략...)
 'Fira Code',
 'Fira Code',
 'Fira Code',
 'Fira Code',
 'Fira Code',
 'Fira Mono for Powerline',
 'Fira Mono for Powerline',
 'Fira Mono for Powerline',
 'Futura',
 'monofur for Powerline']

댓글남기기