[ํŒŒ์ด์ฌ] ์šฐ๋ถ„ํˆฌ์—์„œ ํ•œ๊ธ€ ํฐํŠธ ์„ค์น˜ํ•˜๊ณ  matplotlib์— ์‚ฌ์šฉํ•˜๊ธฐ

Posted by Euisuk's Dev Log on June 9, 2024

[ํŒŒ์ด์ฌ] ์šฐ๋ถ„ํˆฌ์—์„œ ํ•œ๊ธ€ ํฐํŠธ ์„ค์น˜ํ•˜๊ณ  matplotlib์— ์‚ฌ์šฉํ•˜๊ธฐ

์›๋ณธ ๊ฒŒ์‹œ๊ธ€: https://velog.io/@euisuk-chung/ํŒŒ์ด์ฌ-์šฐ๋ถ„ํˆฌ์—์„œ-ํ•œ๊ธ€-ํฐํŠธ-์„ค์น˜ํ•˜๊ณ -matplotlib์—-์‚ฌ์šฉํ•˜๊ธฐ

์•ˆ๋…•ํ•˜์„ธ์š”๐Ÿ˜› ์˜ค๋Š˜์€ ์šฐ๋ถ„ํˆฌ์—์„œ ํ•œ๊ธ€ ํฐํŠธ ์„ค์น˜ํ•˜๊ณ  matplotlib์—์„œ ํ•ด๋‹น ํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

ํŒŒ์ด์ฌ์„ ํ™œ์šฉํ•˜๋‹ค๋ณด๋ฉด ์‹œ๊ฐํ™”๋Š” ํ•„์ˆ˜ ์˜์—ญ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Linux ํ™˜๊ฒฝ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•œ๊ธ€ ํฐํŠธ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์•„ ํ•œ๊ธ€์ด ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋ณธ ๊ฒŒ์‹œ๊ธ€์˜ ์ œ๋ชฉ์ฒ˜๋Ÿผ ๋„ค๋ชจ๋„ค๋ชจ ๋น”์„ ๋งž์€ ๊ฒƒ์ฒ˜๋Ÿผ ๊นจ์ ธ์„œ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค ๐Ÿ˜ฑ

๋„ค๋ชจ๋„ค๋ชจ

์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ๋˜๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ์šด์˜์ฒด์ œ์˜ ๊ธฐ๋ณธ ํฐํŠธ ์„ธํŠธ์— ํ•œ๊ธ€ ํฐํŠธ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ„๋„๋กœ ํ•œ๊ธ€ ํฐํŠธ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Ubuntu ํ™˜๊ฒฝ์—์„œ ๋‚˜๋ˆ” ํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Matplotlib์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ƒ์„ธํžˆ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ฅด๋ฉด 5๋ถ„ ๋‚ด๋กœ ํฐํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‚˜๋ˆ” ํฐํŠธ ์„ค์น˜

์šฐ์„ , ๋‚˜๋ˆ” ํฐํŠธ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

1
sudo apt-get install fonts-nanum*
  1. ํฐํŠธ ์บ์‹œ ์‚ญ์ œ

ํฐํŠธ ์บ์‹œ๋ฅผ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์บ์‹œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

1
fc-cache -fv
  1. ํฐํŠธ ๋ฐฐํฌ

Matplotlib์˜ ํฐํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋‚˜๋ˆ” ํฐํŠธ๋ฅผ ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ €, Matplotlib ์„ค์ • ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์–ด๋”” ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

1
2
import matplotlib
print(matplotlib.__file__)

์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Matplotlib์˜ ๊ฒฝ๋กœ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

1
/usr/anaconda3/lib/python3.7/site-packages/matplotlib/__init__.py

์ด ๊ฒฝ๋กœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ, mpl-data/fonts/ttf ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํฐํŠธ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Anaconda ํ™˜๊ฒฝ์ด๋ผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1
cp /usr/share/fonts/truetype/nanum/Nanum* /usr/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/
  1. Matplotlib ํฐํŠธ ์บ์‹œ ์‚ญ์ œ

Matplotlib์˜ ํฐํŠธ ์บ์‹œ๋ฅผ ์‚ญ์ œํ•˜์—ฌ ์ƒˆ๋กœ์šด ํฐํŠธ๋ฅผ ์ธ์‹ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

1
rm -rf ~/.cache/matplotlib/*
  1. ํฐํŠธ ์ ์šฉ

ํŒŒ์ด์ฌ ํ˜น์€ ์ฃผํ”ผํ„ฐ ๋…ธํŠธ๋ถ์„ ์žฌ์‹คํ–‰ํ•˜์—ฌ ํฐํŠธ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ํฐํŠธ๊ฐ€ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

1
2
import matplotlib.font_manager
print([f.fname for f in matplotlib.font_manager.fontManager.ttflist])

์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์„ค์น˜๋œ ํฐํŠธ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. Nanum์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํฐํŠธ๋“ค์ด ๋ณด์ด๋ฉด ์ œ๋Œ€๋กœ ์„ค์น˜๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํฐํŠธ ์ด๋ฆ„์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1
2
3
import matplotlib.font_manager
font_list = matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf')
print([matplotlib.font_manager.FontProperties(fname=font).get_name() for font in font_list])

์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํฐํŠธ ์ด๋ฆ„๋“ค์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

1
['Nanum Brush Script', 'NanumBarunGothic', 'NanumSquareRound', ...]

์ด์ œ ํฐํŠธ๋ฅผ Matplotlib์—์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์˜ˆ์‹œ ์ฝ”๋“œ ์‹คํ–‰

๋‹ค์Œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜๋ˆ” ํฐํŠธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ด…๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import matplotlib.pyplot as plt
import matplotlib as mpl

# ํฐํŠธ ์„ค์ •
plt.rcParams["font.family"] = 'NanumGothic'
mpl.rcParams['axes.unicode_minus'] = False  # ๋งˆ์ด๋„ˆ์Šค ํฐํŠธ ๊นจ์ง ๋ฐฉ์ง€

# ์˜ˆ์‹œ ๊ทธ๋ž˜ํ”„
plt.figure(figsize=(8, 6))
plt.plot([1, 2, 3, 4], [10, 20, 25, 30])
plt.title('์˜ˆ์ œ ๊ทธ๋ž˜ํ”„')
plt.xlabel('X ์ถ•')
plt.ylabel('Y ์ถ•')
plt.show()

์ด์ œ ํ•œ๊ธ€์ด ์ œ๋Œ€๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ˜

ํ•ด๊ฒฐ

์ด ๊ณผ์ •์„ ํ†ตํ•ด ๋‚˜๋ˆ” ํฐํŠธ๋ฅผ Ubuntu ํ™˜๊ฒฝ์—์„œ Matplotlib์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์ฐธ๊ณ ) Jupyter Snippet

๊ท€์ฐฎ์œผ์‹œ๋‹ค๊ณ ์š”?! ์ €๋„ ๊ท€์ฐฎ์•„์„œ ์ฃผํ”ผํ„ฐ๋…ธํŠธ๋ถ์—์„œ ํ•œ๋ฒˆ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งฐ์Šต๋‹ˆ๋‹ค ๐Ÿ˜

1
2
3
4
5
6
7
8
9
10
11
12
13
# ํ•œ๊ธ€ ํฐํŠธ๊ฐ€ ์—†์„ ๋•Œ
! sudo apt-get install fonts-nanum*

import matplotlib
import subprocess

mpl_file = matplotlib.__file__
mpl_file_loc = '/'.join(mpl_file.split('/')[:-1]) + '/mpl-data/fonts/ttf/'
print(matplotlib.__file__)
print(mpl_file_loc)

# ํฐํŠธ ๋ณต์‚ฌ
subprocess.run(['cp', '/usr/share/fonts/truetype/nanum/Nanum*', mpl_file_loc], shell=True)

๊ฐ€์ƒํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๋ถ„์˜ ๊ฒฝ์šฐ ๊ฐ€์ƒํ™˜๊ฒฝ๋งˆ๋‹ค ์„ค์ •์„ ํ•ด์ค˜์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๊ธดํ•˜์ง€๋งŒ, ํ•œ๊ธ€ ์‚ฌ์šฉ์ด ํ•„์ˆ˜์ ์ด๋ผ๋ฉด ์œ„์— ์†Œ๊ฐœํ•ด๋“œ๋ฆฐ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ผ ํฐํŠธ๋ฅผ ์„ค์ •ํ•ด๋ณด์„ธ์š”!!

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜›



-->