python 그래프 글자 깨짐 해결, 각 축 폰트 설정 다르게 하기


python에서 그래프를 그릴 때, 글자가 깨지는 현상 해결과 폰트 설정을 축 마다 다르게 하는 법을 소개하려 합니다.

python으로 그래프를 그리다 보면 한글 폰트 설정이 제대로 되어 있지 않으면

글자가 깨지는 경우가 존재합니다.

먼저 기본 설정입니다.


해당 코드를 실습할수 있는 데이터는

캐글 데이터 페이지를 통해서 다운로드 부탁드리겠습니다.


#기본 설정 및 데이터 불러오기
import warnings
warnings.filterwarnings(action='ignore')

import pandas as pd

%matplotlib inline
import matplotlib.pyplot as plt

import seaborn as sns

data = pd.read_csv("2019_kbo_for_kaggle_v2.csv")
print(data.shape)
data.head()
(1913, 37)
batter_nameageGPAABRH2B3BHR...tp1BFBPavgOBPSLGOPSp_yearYABYOPS
0백용환24.026.058.052.04.09.04.00.00.0...포수5.06.00.1730.2590.2500.509201479.00.580
1백용환25.047.086.079.08.014.02.00.04.0...포수8.05.00.1770.2260.3540.5802015154.00.784
2백용환26.065.0177.0154.022.036.06.00.010.0...포수20.020.00.2340.3160.4680.7842016174.00.581
3백용환27.080.0199.0174.012.034.07.00.04.0...포수23.020.00.1950.2760.3050.581201717.00.476
4백용환28.015.020.017.02.03.00.00.00.0...포수3.03.00.1760.3000.1760.476201847.00.691

5 rows × 37 columns


plt.figure(figsize=(20,9))

sns.boxplot(x='hand2',y="YOPS", data=data,palette="Spectral")
plt.title('타석위치 별 YOPS Boxplot',size=30)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('hand',size=25)
plt.ylabel('다음 시즌 OPS',size=25);

바로 아래와 같이 ㅁ로 깨짐 현상이 발생합니다.

absolute


인터넷을 찾으면 바로 나오는 것이 아래와 같은 코드입니다.

platform 라이브러리를 통해서 시스템 버전을 확인하고

폰트 이름을 보고 사용 될 폰트를 적용합니다.

from matplotlib import rc
import platform

if platform.system() == 'Windows':
    rc('font', family='Malgun Gothic')
elif platform.system() == 'Darwin': # Mac
    rc('font', family='AppleGothic')
else: #linux
    rc('font', family='NanumGothic')
    
plt.rcParams['axes.unicode_minus'] = False # 마이너스 기호 깨짐 현상 해결 코드
plt.figure(figsize=(20,9))

sns.boxplot(x='hand2',y="YOPS", data=data,palette="Spectral")
plt.title('타석위치 별 YOPS Boxplot',size=30)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('hand',size=25)
plt.ylabel('다음 시즌 OPS',size=25);

absolute


글자 이름이 깨지는 것이 해결이 되었습니다.


기본적인 폰트 경로는 C:\Windows\Fonts 이지만

간혹 경로가 다르신 경우가 있습니다.

from matplotlib import font_manager

if platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name() #원하는 폰트 ttf
    rc('font', family=font_name)
elif platform.system() == 'Darwin': # Mac
    rc('font', family='AppleGothic')
else: #linux
    rc('font', family='NanumGothic')

그러실 경우, 폰트들이 모여져 있는 경로를 찾으신 다음에

.get_name 을 사용해서 해당 폰트의 이름을 추출하는 방식으로 해결이 가능합니다.

plt.figure(figsize=(20,9))

sns.boxplot(x='hand2',y="YOPS", data=data,palette="Spectral")
plt.title('타석위치 별 YOPS Boxplot',size=30)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('hand',size=25)
plt.ylabel('다음 시즌 OPS',size=25);

absolute


마지막으로 제목, x축, y축 마다 폰트를 다르게 적용하는 방법을 소개하려고 합니다.

원하시는 폰트 경로를 fname = 로 넣으시고, 사이즈 지정도 가능합니다.

fontprop_head = font_manager.FontProperties(fname=r'C:\Windows\Fonts\H2GTRE.TTF')
fontprop_x = font_manager.FontProperties(fname=r'C:\Windows\Fonts\YES24.TTF', size = 15)
fontprop_y = font_manager.FontProperties(fname=r'C:\Windows\Fonts\HMFMOLD.TTF', size = 10)

그리고 fontproperties에 저장해두신 폰트 객체를 지정해주시면 됩니다.

다만 객체로 지정하실 때, 사이즈를 지정해두셨더라도 plt 코드 안에 사이즈 관련이 또 있다면

기존에 사이즈 지정 해두신 크기가 아닌 plt에서의 크기가 적용 됩니다.

plt.figure(figsize=(20,9))

sns.boxplot(x='hand2',y="YOPS", data=data,palette="Spectral")
plt.title('타석위치 별 YOPS Boxplot',size=30, fontproperties=fontprop_head)
plt.xticks(fontproperties=fontprop_x) #저장된 폰트 크기 15 적용
plt.yticks(fontsize=20, fontproperties=fontprop_y); #폰트 크기 20 적용

absolute