Python

[Python] 맷플롯립(Matplotlib) 라이브러리(Library)_1

구루싸 2019. 9. 21. 01:46
반응형
SMALL

오늘도 잠을 자지 못하고-_- 파이썬 학습을 하고 있네요

지난 번에 판다스(Pandas)에 내장된 도구로 데이터 시각화를 해보았습니다

오늘은 데이터 시각화를 위해 맷플롯립(Matplotlib)을 이용하는 법을 학습하도록 하겠습니다

우선 시각화를 진행할 데이터를 준비해야겠죠^^

데이터는 KOSIS 국가통계포털(http://kosis.kr/)에서

전출지/전입지(시도)별 이동자수(통계청, 「국내인구이동통계」를 다운받아 사용하겠습니다

 

KOSIS 국가통계포털

 

kosis.kr

# 판다스(Pandas)
import pandas
import matplotlib.pyplot as mp
import matplotlib

matplotlib.rc('font', family = 'AppleGothic') # MAC OS 일 경우 한글 폰트 오류 해결

filepath = "/Users/dennis_sa/Documents/"
# 0번 로우를 header로 설정 
read_data = pandas.read_excel(filepath+"전출입지(시도)별 이동자수.xlsx", header = 0) 
print(read_data.head())

# 2019년 1월 ~ 7월 사이에 서울로 전입한 데이터만 추출
read_data = read_data.fillna(method = 'ffill') # NaN을 앞 데이터로 채움(Merge된 로우를 채움)
fltr = (read_data['전입지별'] == '서울특별시') & (read_data['전출지별'] != '서울특별시')
fltr_data = read_data[fltr]
fltr_data = fltr_data.drop(['전입지별'], axis = 1)
fltr_data.rename({'전출지별':'전출지'}, axis = 1, inplace = True)
fltr_data.set_index('전출지', inplace = True)
print(fltr_data, end = '\n')
from_kangwon = fltr_data.loc['강원도'] # 강원도에서 서울로 전입한 데이터만 추출 : 시리즈(Series) 반환
# 사이즈 지정
mp.figure(figsize = (10, 5))
# X축 눈금 라벨 회전
mp.xticks(rotation = 50) # vertical 등을 지정할 수 있음
# Matplotlib Style 
print(mp.style.available)
# 스타일 지정(위에서 출력된 Matplotlib Style 중에 하나 선택 사용 가능)
mp.style.use('fivethirtyeight') 
# 마커 표시
mp.plot(from_kangwon, marker = 'o', markersize = '10') # OR mp.plot(from_kangwon.index, from_kangwon.values)
# 차트 제목
mp.title('강원도 -> 서울 인구 이동', size = 20)
# 축 이름
mp.xlabel('기간', size = 10)
mp.ylabel('이동 인구수', size = 10)
# 범례 
mp.legend(labels = ['강원 -> 서울'], loc='best', fontsize = 10)
# y축 범위 지정(최소값, 최대값) 
mp.ylim(-500, 3000)
# 주석
mp.annotate( '',
             xy = (2, 2600), 
             xytext = (0, 2500), 
             xycoords = 'data', 
             arrowprops = dict(arrowstyle='->', color = 'skyblue', lw = 5), )
mp.annotate( '인구 이동 증가(2019.01 ~ 02)',
             xy = (2, 2600),
             rotation = 5,
             va = 'baseline',
             ha = 'center',
             fontsize = 10, )
# 화면 분할(axe 객체 마다 그래프 생성)
fig = mp.figure(figsize = (10, 20))
axe1 = fig.add_subplot(2,1,1) # 서브 플롯 생성
axe2 = fig.add_subplot(2,1,2)
axe1.plot(from_kangwon, marker = 'o', markersize = 10)
axe2.plot(from_kangwon, marker = 'o', markerfacecolor = 'red' # 마커 색상
                           , markersize = 10 # 마커 크기
                           , color = 'red' # 선 색상
                           , linewidth = 2                         
                           , label = '강원 -> 서울') 
axe2.legend(loc = 'best')
axe1.set_ylim(-500, 3000)
axe2.set_ylim(-500, 3000)
axe1.set_xticklabels(from_kangwon.index, rotation = 30)
axe2.set_xticklabels(from_kangwon.index, rotation = 30)
axe2.set_title('강원도 -> 서울 인구 이동', size = 20)
axe2.set_xlabel('기간', size = 12)
axe2.set_ylabel('이동 인구수', size = 12)
axe2.tick_params(axis = 'x', labelsize = 10)
axe2.tick_params(axis = 'y', labelsize = 10)    
# Matplotlib에서 사용할 수 있는 색상
colors= {}
for name, hex in matplotlib.colors.cnames.items() :
    colors[name] = hex
print(colors, end = '\n')
# 같은 화면에 그래프 추가
col_months = list(map(str, range(1, 8)))
for idx in range(0, 7) :
    col_months[idx] = '2019. 0' + col_months[idx]
print(col_months)
df = fltr_data.loc[['강원도', '충청남도', '경상북도'], col_months]
mp.style.use('ggplot')
fig = mp.figure(figsize = (10, 5))
ax = fig.add_subplot(1, 1, 1)
ax.plot(col_months, df.loc['강원도', :], marker = 'o', markerfacecolor = 'green', markersize = 10, color = 'olive', linewidth = 2, label = '강원도 -> 서울')
ax.plot(col_months, df.loc['충청남도', :], marker = 'o', markerfacecolor = 'blue', markersize = 10, color = 'skyblue', linewidth = 2, label = '충청남도 -> 서울')
ax.plot(col_months, df.loc['경상북도', :], marker = 'o', markerfacecolor = 'red', markersize = 10, color = 'magenta', linewidth = 2, label = '경상북도 -> 서울')
ax.legend(loc = 'best')
ax.set_title('강원도, 충청남도, 경상북도 -> 서울 인구 이동', size = 15)
ax.set_xlabel('기간', size = 12)
ax.set_ylabel('이동 인구수', size = 12)
ax.set_xticklabels(col_months, rotation = 50)
ax.tick_params(axis = "x", labelsize = 10)
ax.tick_params(axis = "y", labelsize = 10)
mp.show()

위의 코드는 맷플롯립(Matplotlib)의 선 그래프를 다양한 방법으로 그리고 있습니다

한 화면에 여러개의 선 그래프를 그리거나 여러 개로 분할하여 그래프를 그리고 각각의 제목부터 범례 등을 붙이는 작업들을 진행합니다

제가 사용한 데이터가 2019.01~2019.07월까지의 인구 이동 데이터인데 2019. 01 사이에 공백이 하나 있어 index 오류가 발생했네요-_-

(위의 코드를 실행해보실 때 col_month[idx] = '2019. 0' 이 부분의 0앞에 공백을 빼시면 오류가 발생합니다)

 

그럼 오늘은 이만-_-

반응형
LIST