ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Matplotlib] 파이썬 Matplotlib에서 한글 또는 마이너스 기호가 깨질 때 처리하는 방법
    Python/시각화 2023. 5. 12. 09:46
    반응형

    Matplotlib에서 한글 또는 마이너스 기호가 깨질 때 처리하는 방법


    파이썬(Python)의 대표적인 시각화 패키지인 맷플롯립(Matplotlib)은 파이썬 시각화 패키지의 대부분을 컨트롤할 수 있는 강력한 기능을 보여주고 있습니다. 그런데, 이 패키지를 이용해서 시각화를 할 때 글꼴을 바꾸고 싶을 때 어떤 코드를 써야 하는지 난감한 경우가 있지요. 이런 상황은, 주피터 노트북(Jupyter Notebook) 등의 개발환경(IDE)에서 한국어가 포함된 자료를 시각화할 때 주로 발생합니다. 주피터 노트북은 기본적으로 한국어 글꼴을 지원하지 않기 때문이지요.

     

     

    붓꽃(iris) 데이터를 시각화하는 것으로 예를 들어 보자면, 이런 문제가 생길 수 있습니다. 아래에 코드를 적어놓았으니 살펴보시기 바랍니다.

     

     

    from sklearn.datasets import load_iris
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import pandas as pd
    import matplotlib.font_manager as fm
    
    d = load_iris()
    df_iris = pd.DataFrame(data=d.data, columns=d.feature_names)

     

    plt.scatter(data=df_iris, x='sepal length (cm)', y='petal length (cm)')
    plt.title('붓꽃 데이터 시각화 자료')
    plt.xlabel('잎 길이 (cm)')
    plt.ylabel('꽃잎 길이 (cm)')
    plt.xlim(-1,8)
    plt.show()
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 44867 (\N{HANGUL SYLLABLE GGOC}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 51086 (\N{HANGUL SYLLABLE IP}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 44600 (\N{HANGUL SYLLABLE GIL}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 51060 (\N{HANGUL SYLLABLE I}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 48531 (\N{HANGUL SYLLABLE BUS}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 45936 (\N{HANGUL SYLLABLE DE}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 53552 (\N{HANGUL SYLLABLE TEO}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 49884 (\N{HANGUL SYLLABLE SI}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 44033 (\N{HANGUL SYLLABLE GAG}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 54868 (\N{HANGUL SYLLABLE HWA}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 51088 (\N{HANGUL SYLLABLE JA}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 47308 (\N{HANGUL SYLLABLE RYO}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)

     

     

    데이터 자체는 시각화가 되었지만, 한글로 적은 부분만 □□ □□□ □□□ □□ 와 같이 정상적으로 표기되지 않는 것을 확인할 수 있습니다. 이렇게 된다면, 우리의 선택지는 둘 중 하나입니다.

     

     

    1. 한국어를 포기하고 영어로 적거나
    2. 한국어를 표기할 수 있는 코드를 찾아보는 것이죠

     

    전자의 경우는 따로 가르쳐 드릴 내용이 없으니, 후자의 내용을 살펴보도록 합시다. Matplotlib에서는 plt.rc 함수로 글꼴 설정을 할 수 있습니다. 다만, 우리가 그래픽 툴에서 사용하듯이 폰트 이름을 찾아볼 수 있는건 아니고 폰트 패밀리(font family) 이름을 따로 알아두고 적어야 합니다. 아래에 폰트 패밀리를 알아보는 방법과, 원하는 글꼴을 설정하는 방법을 적어두었으니 참고해 주시기 바랍니다.

     

     

    # 현재 컴퓨터에 설치된 글꼴의 폰트 패밀리 알아보는 방법
    [f.name for f in fm.fontManager.ttflist]
    ['STIXSizeFourSym',
     'STIXNonUnicode',
     'DejaVu Serif',
     'STIXNonUnicode',
     'cmex10',
     ...
     'Calibri',
     'Amiri',
     'Segoe UI',
     'Noto Serif',
     'Scheherazade']

     

    # 맑은 고딕으로 글꼴 설정하기
    # plt.rc('font', family='Apple Gothic')  # 맥OS를 사용하고 있을 때
    plt.rc('font', family='Malgun Gothic')  # 윈도우를 사용하고 있을 떄
    plt.scatter(data=df_iris, x='sepal length (cm)', y='petal length (cm)')
    plt.title('붓꽃 데이터 시각화 자료')
    plt.xlabel('잎 길이 (cm)')
    plt.ylabel('꽃잎 길이 (cm)')
    plt.xlim(-1,8)
    plt.show()
    C:\ProgramData\anaconda3\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 8722 (\N{MINUS SIGN}) missing from current font.
      fig.canvas.print_figure(bytes_io, **kw)

     

     

    이렇게 글꼴을 바꿔주면, 한글이 정상적으로 출력되는 변화를 확인할 수 있습니다. 그런데, 여기서는 다른 문제가 발생하지요? 바로 마이너스 기호가 □로 표기된다는 점입니다. 도표 위에 나온 경고 메시지를 살펴보면, 현재 글꼴에서 마이너스 기호가 없다고 합니다. 이 때는, 마이너스 기호가 정상적으로 표기되는 글꼴로 바꿔 주거나, 마이너스 기호를 따로 처리하도록 코드를 한 줄 추가해 주는 것이 좋습니다.

     

     

    # 마이너스 기호 문제 해결하기
    mpl.rcParams['axes.unicode_minus'] = False
    plt.scatter(data=df_iris, x='sepal length (cm)', y='petal length (cm)')
    plt.title('붓꽃 데이터 시각화 자료')
    plt.xlabel('잎 길이 (cm)')
    plt.ylabel('꽃잎 길이 (cm)')
    plt.xlim(-1,8)
    plt.show()

     

     

    이 코드는, 우리가 일상적으로 혼용해서 쓰는 마이너스 기호를 처리하는 방법을 바꾸는 것입니다. 우리는 흔히 마이너스 기호와 대시, 하이픈을 구분 없이 사용하는데, 컴퓨터 프로그래밍 언어에서는 아스키(ASCII) 문자의 하이픈 마이너스로 통일해서 사용하기 때문에, 글꼴 차원에서 해당 기호를 지원하지 않으면 마이너스 기호가 깨져 보이게 되는 것입니다. 이 때문에, 하이픈 마이너스 기호를 사용하지 않겠다고 선언해 주면, 대체 기호가 사용되기 때문에 마이너스 기호가 정상적으로 보이게 되는 것이죠.

    반응형

    댓글

문의: jwkang3929@naver.com