반응형
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
'Python' 카테고리의 다른 글
[Python] 맷플롯립(Matplotlib) 라이브러리(Library)_3 (0) | 2019.09.25 |
---|---|
[Python] 맷플롯립(Matplotlib) 라이브러리(Library)_2 (0) | 2019.09.23 |
[Python] 판다스(Pandas) 라이브러리(Library)_6 (1) | 2019.09.20 |
[Python] 판다스(Pandas) 라이브러리(Library)_5 (0) | 2019.09.17 |
[Python] 판다스(Pandas) 라이브러리(Library)_4 (0) | 2019.09.15 |