Streamlit Matplotlib 한글폰트 적용 예제
Page content
Streamlit Matplotlib-Seaborn 한글폰트 적용
개요
- 배포 시, matplotlib & seaborn 한글 폰트 적용 하는 방법에 대해 알아본다.
- 나눔고딕 폰트를 적용해본다.
폰트 다운로드
개발환경 세팅
- git clone 명령어를 활용하여 프로젝트 repo를 다운로드 받는다.
- 가상환경을 설정한다.
virtualenv venv
실행한다.source venv/Scripts/activate
실행하여 가상환경에 접속한다.
$ virtualenv venv
created virtual environment CPython3.9.13.final.0-64 in 606ms
creator CPython3Windows(dest=C:\Users\YONSAI\Desktop\streamlit-korean-fonts\venv, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\YONSAI\AppData\Local\pypa\virtualenv)
added seed packages: pip==23.1.2, setuptools==67.6.1, wheel==0.40.0
activators BashActivator,BatchActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
$ source venv/Scripts/activate
(venv)
$
- requirements.txt 파일에 다음 라이브러리만 설치한다.
streamlit
matplotlib
seaborn
pandas
numpy
폰트 폴더 설정
- customFonts 폴더를 만들고 다운로드 받은 폴더를 추가한다.
테스트 (에러)
- 로컬에서 간단한 streamlit 파일을 만들고 테스트를 진행한다.
- 파일명 : app.py
# -*- coding:utf-8 -*-
import streamlit as st
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
def main():
tips = sns.load_dataset("tips")
st.dataframe(tips)
fig, ax = plt.subplots()
sns.scatterplot(data=tips, x = 'total_bill', y = 'tip', hue='day')
ax.set_title("한글 테스트")
st.pyplot(fig)
if __name__ == "__main__":
main()
- 위 그림에서 보는 것처럼 한글이 깨진다.
코드 수정
- 코드를 아래와 같이 수정한다.
# -*- coding:utf-8 -*-
import streamlit as st
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# 한글폰트 적용
# 폰트 적용
import os
import matplotlib.font_manager as fm # 폰트 관련 용도 as fm
def unique(list):
x = np.array(list)
return np.unique(x)
@st.cache_data
def fontRegistered():
font_dirs = [os.getcwd() + '/customFonts']
font_files = fm.findSystemFonts(fontpaths=font_dirs)
for font_file in font_files:
fm.fontManager.addfont(font_file)
fm._load_fontmanager(try_read_cache=False)
def main():
fontRegistered()
fontNames = [f.name for f in fm.fontManager.ttflist]
fontname = st.selectbox("폰트 선택", unique(fontNames))
plt.rc('font', family=fontname)
tips = sns.load_dataset("tips")
fig, ax = plt.subplots()
sns.scatterplot(data=tips, x = 'total_bill', y = 'tip', hue='day')
ax.set_title("한글 테스트")
st.pyplot(fig)
st.dataframe(tips)
if __name__ == "__main__":
main()
- 결과물은 여기에서 확인한다.
책 홍보
- Streamlit 관련 책을 집필하였습니다.