반응형
SMALL
이어서 맷플롯립(Matplotlib) 라이브러리를 더 학습해보도록 하겠습니다
오늘은 누적 선 그래프(stacked line plot)라고도 하는 면적 그래프와 막대 그래프(bar plot)를 그려보겠습니다
# 판다스(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')
# 2019. 01 ~ 2019. 07 강원도, 충청남도, 경상북도, 전라남도 데이터 추출
col_months = list(map(str, range(1, 8)))
for idx in range(0, 7) :
col_months[idx] = '2019. 0' + col_months[idx]
df = fltr_data.loc[['강원도', '충청남도', '경상북도', '전라남도'], col_months]
df = df.transpose()
# 스타일 서식 지정
mp.style.use('ggplot')
# 면적 그래프 그리기
ax = df.plot(kind = 'area', # 면적 그래프
stacked = False,
alpha = 0.2, # 투명도(0~1범위)
figsize = (10, 5))
ax.set_title('타시도 -> 서울 인구 이동', size = 20, color = 'brown', weight = 'bold')
ax.set_ylabel('이동 인구 수', size = 10, color = 'blue')
ax.set_xlabel('기간', size = 10, color = 'blue')
ax.legend(loc = 'best', fontsize = 15)
# 막대 그래프 그리기
df.plot(kind = 'bar', figsize = (10, 5), width = 0.7, color = ['orange', 'green', 'skyblue', 'blue'])
mp.title('타시도 -> 서울 인구 이동', size = 20)
mp.ylabel('이동 인구 수', size = 10)
mp.xlabel('기간', size = 10)
mp.ylim(0, 3000)
mp.legend(loc = 'best', fontsize = 15)
# 합계 열 생성 및 정렬
df = df.transpose()
df['합계'] = df.sum(axis = 1)
df_total = df[['합계']].sort_values(by='합계', ascending = True)
df_total.plot(kind = 'barh', color = 'cornflowerblue', width = 0.5, figsize = (10, 5))
mp.title('타시도 -> 서울 인구 이동', size = 20)
mp.ylabel('전출지', size = 10)
mp.xlabel('이동 인구 수', size = 10)
mp.show()
선 그래프를 그릴 때와 거의 흡사하고 plot() 메소드의 kind 옵션만 변경해주면 구현이 가능합니다^^
이제 보조 축(지금까지는 y축을 하나만 이용)을 이용해서 2개의 y축을 이용하여 그래프를 보겠습니다
# 판다스(Pandas)
import pandas
import matplotlib.pyplot as mp
import matplotlib
matplotlib.rc('font', family = 'AppleGothic') # MAC OS 일 경우 한글 폰트 오류 해결
mp.rcParams['axes.unicode_minus'] = False #마이너스 부호 출력 False
filepath = "/Users/dennis_sa/Documents/"
# 0번 로우를 header로 설정
read_data = pandas.read_excel(filepath+"남북한발전전력량.xlsx", header = 0, convert_float = True)
read_data = read_data.fillna(method = 'ffill') # NaN을 앞 데이터로 채움(Merge된 로우를 채움)
fltr = (read_data['남북한별'] == '남한')
fltr_data = read_data[fltr]
fltr_data.drop('남북한별', axis = 'columns', inplace = True)
fltr_data.set_index('발전 전력별', inplace = True)
print(fltr_data)
col_months = list(map(str, range(2010, 2018)))
fltr_data = fltr_data.loc[['합계', '수력', '화력', '원자력'], col_months]
fltr_data = fltr_data.T
# 증감률
fltr_data = fltr_data.rename(columns = {'합계':'총전력량'})
fltr_data['총전력량 - 1년'] = fltr_data['총전력량'].shift(1)
fltr_data['증감률'] = ((fltr_data['총전력량']/fltr_data['총전력량 - 1년']) - 1 ) * 100
print(fltr_data)
# 2축 그래프
ax1 = fltr_data[['수력', '화력', '원자력']].plot(kind = 'bar', figsize = (10, 5), width = 0.7, stacked = True)
ax2 = ax1.twinx() # 쌍둥이 객체 생성
ax2.plot(fltr_data.index,
fltr_data.증감률,
ls = '--', # 선 스타일(line style)
marker = 'o',
markersize = 10,
color = 'red',
label = '전년대비 증감률(%)')
ax1.set_ylim(0, 10000)
ax2.set_ylim(-50, 50)
ax1.set_xlabel('연도', size = 10)
ax1.set_ylabel('발전량(억 KWh)')
ax2.set_ylabel('전년 대비 증감률(%)')
mp.title('남한 전력 발전량(2010 ~ 2017)', size = 20)
ax1.legend(loc = 'upper left')
mp.show()
사용한 데이터 소스는 아래의 링크에서 받아서 사용해보세요~
데이터 분석 공부를 하기 위해 파이썬(Python)을 학습하고 있지만
파이썬 문법(Syntax)보다 더 어려운 건 역시 데이터 자체네요-_-
데이터를 어떻게 처리하여 볼 것인가는 역시 인간의 몫인거 같습니다 ㅜㅜ
오늘은 피곤한 관계로 여기서 이만-_-
반응형
LIST
'Python' 카테고리의 다른 글
[Python] 씨본(Seaborn) 라이브러리(Library)_1 (0) | 2019.09.26 |
---|---|
[Python] 맷플롯립(Matplotlib) 라이브러리(Library)_3 (0) | 2019.09.25 |
[Python] 맷플롯립(Matplotlib) 라이브러리(Library)_1 (0) | 2019.09.21 |
[Python] 판다스(Pandas) 라이브러리(Library)_6 (1) | 2019.09.20 |
[Python] 판다스(Pandas) 라이브러리(Library)_5 (0) | 2019.09.17 |