차트 제목과 축 이름을 한글로 설정해 출력하는 경우 다음 오류메시지와 함께 깨지는 경우가 발생할 수 있다.
....pyenv/versions/pandas/lib/python3.7/site-packages/matplotlib/backends/backend_agg.py:183:RuntimeWarning: Glyph 44221 missing from current font. font.set_text(s, 0, flags=flags)
fontmanager로 현재 시스템에 설정된 폰트들을 확인할 수 있다. 설정할 폰트명을 다음과 같이 가져올 수 있다.
>>> [(f.name, f.fname) for f in fm.fontManager.ttflist if'D2Coding'in f.name][('D2Coding','/Users/jeongdaye/Library/Fonts/D2Coding-Ver1.3.2-20180524-all.ttc')]
##
## Note that font.size controls default text sizes. To configure
## special text sizes tick labels, axes, labels, title, etc, see the rc
## settings for axes and ticks. Special text sizes can be defined
## relative to font.size, using the following values: xx-small, x-small,
## small, medium, large, x-large, xx-large, larger, or smaller
font.family : D2Coding
#font.style : normal
#font.variant : normal
#font.weight : normal
#font.stretch : normal
#font.size : 10.0
마이너스 폰트 출력 설정
그래프에서 마이너스 폰트가 깨지는 문제에 대해 대처할 수 있다.
mpl.rcParams['axes.unicode_minus']=False
KOSIS의 시도별 전출입 인구수 데이터를 시각화해볼 것이다.
>>>import pandas as pd>>>import matplotlib.pyplot as plt>>> df = pd.read_excel('시도별 전출입 인구수.xlsx', fillna=0, header=0)>>> df.head() 전출지별 전입지별 1970197119721973197419751976 ... 2009201020112012201320142015201620170 전출지별 전입지별 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) ... 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명)1 전국 전국 4046536421016436879384860418529796990114406773250 ... 8487275822659481271957506691741178476290987755286737843071542262 NaN 서울특별시 1742813167170513493331831858205039233966622756510 ... 1873188173301517217481555281152009015735941589431151560214729373 NaN 부산광역시 448577389797362202482061680984805979724664 ... 5193105193345080434610424784514857105070314590154390734 NaN 대구광역시 ------- ... 398626370817370563348642351873350213351424328228321182
NaN 데이터가 들어 있는 것을 확인할 수 있다. 누락 데이터는 method=ffill 옵션을 사용하면 누락데이터가 들어있는 행의 바로 앞에 위치한 행의 데이터 값을 채울 수 있다.
>>> df = df.fillna(method='ffill')>>> df.head() 전출지별 전입지별 1970197119721973197419751976 ... 2009201020112012201320142015201620170 전출지별 전입지별 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) ... 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명) 이동자수 (명)1 전국 전국 4046536421016436879384860418529796990114406773250 ... 8487275822659481271957506691741178476290987755286737843071542262 전국 서울특별시 1742813167170513493331831858205039233966622756510 ... 1873188173301517217481555281152009015735941589431151560214729373 전국 부산광역시 448577389797362202482061680984805979724664 ... 5193105193345080434610424784514857105070314590154390734 전국 대구광역시 ------- ... 398626370817370563348642351873350213351424328228321182
plt.annotate('', xy=(x1,y1), # 화살표 머리 부분 xytext=(x2,y2), # 화살표 꼬리 부분 xycoords='data', # 좌표체계 arrowprops=() # 화살표 서식 )plt.annotate('텍스트', # 텍스트 입력 xy=(x1,y1), # 텍스트 위치 기준점 rotation=n, # 텍스트 회전 각도 va='baseline', # 텍스트 상하 정렬 ha='center', # 텍스트 좌우 정렬 fontsize=n, # 텍스트 크기 )
plt.ylim(50000, 800000)# y축 범위 지정# 화살표 그리기(주석)plt.annotate('', xy=(20, 620000), xytext=(2,290000), xycoords='data', arrowprops=dict(arrowstyle='->', color='skyblue',lw=5),)plt.annotate('', xy=(47, 450000), xytext=(30,580000), xycoords='data', arrowprops=dict(arrowstyle='->', color='olive',lw=5),)# 텍스트 표시(주석)plt.annotate('인구 이동 증가(1970-1995)', # 텍스트 입력 xy=(10,450000), # 텍스트 위치 기준점 rotation=25, # 텍스트 회전 각도 va='baseline', # 텍스트 상하 정렬 ha='center', # 텍스트 좌우 정렬 fontsize=15, # 텍스트 크기 )plt.annotate('인구 이동 감소(1995-2017)', # 텍스트 입력 xy=(40,560000), # 텍스트 위치 기준점 rotation=-11, # 텍스트 회전 각도 va='baseline', # 텍스트 상하 정렬 ha='center', # 텍스트 좌우 정렬 fontsize=15, # 텍스트 크기 )plt.show()
화면을 분할해 그래프 여러 개 그리기
화면을 여러개로 분할하고 분할된 각 화면에 서로 다른 그래프를 그릴 수 있다. 한 화면에서 여러개의 그래프를 비교하거나 다양한 정보를 동시에 보여줄 때 사용하면 좋다.
figure() 함수를 사용해 그래프를 그리는 그림틀을 만들고, 그림틀 객체에 add_subplot() 메소드를 적용하여 그림틀을 여러개로 분할할 수 있다. 이때 나눠진 각 부분을 axe 객체라고 부른다.