import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
df_move = pd.read_excel("C:/Users/Hoon/Desktop/엔코아 파이썬/데이터 시각화/시도별 전출입 인구수.xlsx")
df_move.fillna(method='ffill',inplace=True)
# 한글 폰트 세팅
font_path = "./malgun.TTF"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)
'''
서울에서 다른지역으로 이동한 데이터만 추출하여 정리
(데이터프레임객체['열명']=='값'비교 연산자 사용)
'''
df_seoul =df_move[(df_move.전출지별 == '서울특별시')&(df_move.전입지별!='서울특별시')]
#df_seoul 전출지별 삭제
df_seoul.drop('전출지별',axis=1,inplace=True)
#df_seoul 전입지별 열 이름 전입지로 변경
df_seoul.rename({'전입지별':'전입지'},axis=1 ,inplace=True)
#전입지 열을 df_seoul의 인덱스로 지정
df_seoul.set_index('전입지',inplace=True)
df_seoul.head(1)
#서울에서 경기도로 이동한 데이터 값만 선택
sr_one = df_seoul.loc['경기도']
#matplotlib 선 그래프 :plt.plot(x축,y축)
#x,y축 데이터를 matplotlib plot 함수에 입력
plt.plot(sr_one.index,sr_one.values)
#plt.show()
#판다스 객체를 plot 함수에 입력
sr_one.T.plot()
#plt.show()
'''차트제목, 축 이름 추가
-그래프 객체에 차트 제목을 추가시 title() 함수 사용
-x축 이름은 xlabel() 함수, y축 이름은 ylabel()함수
''''''
스타일 리스트 for문으로 보기 아래
for i in plt.style.available:
'''
#x,y축 데이터를 plot함수에 입력
plt.figure(figsize=(14,5)) #그림판 준비
plt.style.use('fast')
plt.xticks(rotation=45)
#마커 그리기
'''
plt.plot에 마커'o'추가, 마커크기 10으로 변경후 다시 그래프 실행
-plt.plot(sr_one.index,sr_one.values,marker='o',markersize=10)
'''
plt.plot(sr_one.index,sr_one.values,marker='o',markersize=10)
#원본
#plt.plot(sr_one.index,sr_one.values)
#차트 제목 추가(서울 ->경기 인구 이동)
plt.title('서울-> 경기 인구이동', fontsize=30)
#축이름 추가(x축 : 기간, y축: 이동 인구수)
plt.xlabel('기간',fontsize=20)
'''
주석을 넣을 여백공간을 충분히 확보하기 위해 ylim()함수를 사용하여 y축 범위를 먼저 늘려준다
-y축 범위를 최소값 50000, 최대값 800000으로 지정하여 그래프 실행 (최소값, 최대값)
'''
plt.ylim(50000,800000)
plt.ylabel('이동 인구 수',fontsize=20)
#변경사항 저장하고 그래프 출력
#파란색 선은 서울 --> 경기로 가는 선 loc는 위치 best로 하면 가장 좋은 곳으로
'''
loc = best,upper,right,left등 있다 .
'''
plt.legend(['서울 --> 경기'],fontsize=10,loc='best')
#plt.show()
'''<그래프 꾸미기>
- x축 눈금 라벨의 글씨가 서로 겹쳐 잘 보이지 않는 문제를 해결 하는 두가지
1) 공간을 만들기 위해 figure() 함수로 그림틀의 가로 사이즈를 더 크게 설정
--> 그림 사이즈 지정 (가로 14인치, 세로 5인치)후 다시 실행
plt.figure(figsize=(14,5))
2)xticks() 함수로 x축 눈금 라벨 회전
-rotation을 vertical로 설정하여 회전
'''
#회전 각도
plt.xticks(rotation=45)
#plt.show()
'''
<스타일 서식 지정>
-색 ,폰트 등 디자인적 요소를 사전에 지정된 스타일로 빠르게 일괄 변경
-스타일 서식을 지정하는 것은 Matplotlib 환경 설정을 변경하는 것 이므로 다른 파일에도 계속 적용
● ggplot 스타일 서식 지정 후 다시 그래프 실행
plt.style.use('ggplot')
''''''
● 스타일 리스트 출력
print(plt.style.available)
['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background',
'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright',
'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid',
'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel',
'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid',
'tableau-colorblind10']
'''
'''
annotate() 함수로 화살표와 텍스트 위치를 잡아서 배치한다.
-위치를 나타내는 (x,y) 좌표에서 x값은 인덱스 번호를 사용한다.
-y 좌표값에 들어갈 인구수 데이터는 숫자값이므로 그대로 사용할 수 있다.
-xy = (1,50000)은 인덱스 번호 1을 x값으로 하고 50000명을 y값으로 한다는 뜻
annotation()함수로 화살표 표시
-S는 ", 화살표의 머리부분은 xy, 꼬리부분 xytext, 화살표 서식 arrowprops=dict() 사용
-화살표 서식은 딕셔너리 함수 내 arrowstyle(->), color (skyblue), lw(5)를 지정
'''
plt.annotate('',xy=(21,620000),xytext=(2,250000),arrowprops=dict(arrowstyle='->',color='skyblue',lw=5))
plt.annotate('',xy=(45,350000),xytext=(30,680000),arrowprops=dict(arrowstyle='->',color='olive',lw=5))
#plt.show()
'''
인구 이동 증가(1970-1955) 텍스트 추가
annotate() 함수
● 텍스트 입력(s), 텍스트 중심점 입력(xy), 텍스트 회전각도(rotation), 상하정렬(va), 좌우정렬(ha)
● 텍스트 크기 (fontsize)
'''
plt.annotate(text='인구이동 증가(1970-1995)',xy=(10,350000),fontsize=15,rotation=25,va='baseline',ha='center')
plt.annotate(text='인구이동 감소(1995-2017)',xy=(38,420000),fontsize=15,rotation=-30,va='baseline',ha='center')
#plt.show()
'''화면 분할하여 그래프 여러 개 그리기 - axe 객체 활용
-화면을 여러개로 분할하고 분할된 각 화면에 서로 다른 그래프를 그리는 방법
-여러 개의 axe 객체를 만들고, 분할된 화면마다 axe 객체를 하나씩 배정
-axe 객체는 각각 서로 다른 그래프 표현
-한 화면에서 여러 개의 그래프를 비교하거나 다양한 정보를 동시에 보여줄 때 사용
-axe 객체를 1개만 생성하는 경우에는 하나의 그래프만 표시
(--------------------------------------------------------------------------------)
[실습] figure()함수 사용 그래프를 그리는 그림틀(fig)생성
[실습2] figsize 옵션으로 (가로,세로) 그림 틀의 크기 설정
-->fig = plt.figure(figsize=(,))
[실습3] fig객체에 add_subplot() 메소드를 적용하여 그림틀을 여러개로 분할(각 부분은 axe 객체)
ax1 = fig.add_subplot(, , ) #2행1열의 1번째
ax2 = fig.add_subplot(, ,) # 2행 1열의 2번째
'''
fig = plt.figure(figsize=(10,10))
ax1 = fig.add_subplot(2,1,1) #2행1열의 1번째
ax2 = fig.add_subplot(2,1,2) # 2행 1열의 2번째
ax1.plot(sr_one,'o',markersize=3) #점으로 표시 한다.
ax2.plot(sr_one) #선 그리기
ax2.legend(['서울->경기'], loc ='best')
ax1.set_ylim(50000,600000)
ax1.set_title('안녕하세요!')
ax1.set_xlabel('x라벨입니다.')
ax1.set_ylabel('Y라벨 입니다.')
ax2.set_ylim(0,60000)
ax1.set_xticklabels(labels=sr_one.index,rotation=75, fontdict=dict(fontsize=10))
ax2.set_xticklabels(labels=sr_one.index,rotation=75, fontdict=dict(fontsize=10))
#plt.show()
'''화면 분할하여 그래프 여러 개 그리기 - Axe 객체활용
● 앞 부분에 추가
● axe 객체에 plot함수로 그래프 출력
''''''
lw = 선의 두께
'''
years=list(map(str,range(1970, 2018)))
df_3 = df_seoul.loc[['충청남도','경상북도','강원도'],years]
fig = plt.figure(figsize=(20,5))
ax = fig.add_subplot(1,1,1) # 1행 1열에 하나
# axe 객체에 plot 함수로 그래프 출력
ax.plot(years, df_3.loc['충청남도',:],markerfacecolor='green',markersize=10, color='olive',linewidth=2, label='서울->충남')
ax.plot(years, df_3.loc['경상북도',:],markerfacecolor='blue',markersize=10, color='skyblue',linewidth=2, label='서울->경북')
ax.plot(years, df_3.loc['강원도',:],markerfacecolor='red',markersize=10, color='magenta',linewidth=2, label='서울->강원')
ax.legend(loc='best')
# 차트 제목 추가
ax.set_title('서울 -> [충남, 경북, 강원] 인구이동', fontsize=20)
# 축이름 추가
ax.set_xlabel('기간',fontsize=12)
plt.xticks(rotation=45)
ax.set_ylabel('이동인구수', fontsize=12)
#plt.show()
'''4개지역으로 각각 만들기
'''
years=list(map(str,range(1970, 2018)))
df_3 = df_seoul.loc[['충청남도','경상북도','강원도','전라남도'],years]
fig = plt.figure(figsize=(20,5))
ax1 = fig.add_subplot(2,2,1)
ax1.plot(years, df_3.loc['충청남도',:], marker='o',markerfacecolor='green',markersize=3, color='olive',linewidth=2, label='서울->충남')
ax1.set_title('서울 -> 충남 인구이동', fontsize=20)
ax1.legend(loc='best')
ax1.set_ylim(0,60000)
plt.xticks(rotation=90)
ax2 = fig.add_subplot(2,2,2)
ax2.plot(years, df_3.loc['경상북도',:], marker='o',markerfacecolor='blue',markersize=3, color='skyblue',linewidth=2, label='서울->경북')
ax2.set_title('서울 -> 경북 인구이동', fontsize=20)
ax2.legend(loc='best')
ax2.set_ylim(0,60000)
plt.xticks(rotation=90)
ax3 = fig.add_subplot(2,2,3)
ax3.plot(years, df_3.loc['강원도',:], marker='o',markerfacecolor='red',markersize=3, color='magenta',linewidth=2, label='서울->강원')
ax3.set_title('서울 -> 강원도 인구이동', fontsize=20)
ax3.legend(loc='best')
ax3.set_ylim(0,60000)
plt.xticks(rotation=90)
ax4 = fig.add_subplot(2,2,4)
ax4.plot(years, df_3.loc['전라남도',:], marker='o',markerfacecolor='orange',markersize=3, color='red',linewidth=2, label='서울->전남')
ax4.set_title('서울 -> 전라남도 인구이동', fontsize=20)
ax4.legend(loc='best')
ax4.set_ylim(0,60000)
plt.xticks(rotation=90)
plt.show()