Python / / 2022. 9. 30. 14:25

Python - Pandas 그래프 시각화 -2

from turtle import bgcolor
import matplotlib
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)

'''
같은 화면에 그래프 추가 

-서울에서 충청남도, 경상북도, 강원도로 이동한 인구 변화 그래프 3개를 같은 화면에 생성
--각지역에 해당하는 행 선택 
--동일한 ax 객체에 선 그래프로 출력하는 plot()메소드를 3번 적용
--범레, 차트 제목 등 표시

'''
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)


'''
--------------------------------------------------------------------------------------------------------
'''
#컬러 정보를 담을 빈 딕셔너리 생성 

colors ={}
#컬러이름과 헥사코드를 확인하여 딕셔너리에 입력

for name, hex in matplotlib.colors.cnames.items():
    colors[name] = hex

#딕셔너리 출력
#print(colors)

'''면적 그래프 
Area plot는 각 열의 데이터를 선 그래프로 구현 후 선 그래프와 x축 사이 공간에 색을 입힌다
색의 투명도(alpha)는 기본값 0.5로 투과되어 보임 ( 투명도 : 0~1 범위)

Area plot는 각 열의 데이터를 선 그래프로 구현 후 선 그래프와 x축 사이 공간에 색을 입힌다
색의 투명도(alpha)는 기본값 0.5로 투과되어 보임 ( 투명도 : 0~1 범위)

plot(kind='area')

그래프를 누적 할지 설정 
- stacked=True로 할경우, 겹치지 않고 스택을 쌓는다 False로 할 경우 안겹치고 쌓음

'''


df_4 = df_seoul.loc[['충청남도','경상북도','강원도','전라남도']]
#df_4.T.plot(kind='area', stacked=True,alpha=0.2, figsize=(20, 10))
# plt.title('서울 -> 타시도 인구 이동', size=30) 
# plt.ylabel('이동 인구 수', color='red',size=20) 
# plt.xlabel('기간', color='skyblue', size=20) 
# plt.legend(loc='best', fontsize=15) 
#plt.show()

'''
------------------------------------------------------------------------------------
'''
# 앞의 stacked=True 면적 그래프 객체의 ax 객체 설정하여 세부적인 요소 설정
# 면적 그래프 axe 객체 생성

# ax = df_4.T.plot(kind='area', stacked=True, alpha=0.2, figsize=(20, 10))
# print(type(ax)) # ax 객체 타입 확인
# # axe 객체 설정 변경
# ax.set_title('서울 -> 타시도 인구 이동', size=30, color='brown', weight='bold') # fontproperties=mg_30
# ax.set_ylabel('이동 인구 수', size=20, color='blue') # fontproperties=mg_20
# ax.set_xlabel('기간', size=20, color='blue') # fontproperties=mg_20
# ax.legend(loc='best', fontsize=15) # prop=mg_15
# plt.show()
'''
막대 그래프 

데이터 값의 크기에 비례하여 높이를 갖는 직사각형 막대로 표현 
막내높이의 상대적 길이 차이를 통해 값의 크고 작음 설명 
막대 그래프 두 종류  : 세로형, 가로형

세로형의 경우 정보 제공 측면에서 선 그래프와 별 차이 없음 
-시계열 데이터를 표현하는데 적합! 

plot(kind='bar')
'''

# col_years = list(map(str, range(2010, 2018)))
# df_4 = df_seoul.loc[['충청남도','경상북도', '강원도', '전라남도'], col_years]
# df_4 = df_4.transpose()
# df_4.plot(kind='bar', figsize=(20, 10), width=0.7,
#          color=['orange', 'green', 'skyblue', 'blue'])

# plt.ylim(0, 30000)
# plt.title('서울 -> 타시도 인구 이동', size=30) # fontproperties=mg_30
# plt.ylabel('이동 인구 수', size=20) # fontproperties=mg_20
# plt.xlabel('기간', size=20) # fontproperties=mg_20
# plt.legend(loc='best', fontsize=15) # prop=mg_15
# plt.show()

'''가로형 막대 그래프 
-각 변수 사이 값의 크기 차이를 설명하는데 적합, kind= 'barh'
-2010~2017년 서울에서 각 시도로 이동한 인구의 합계를 비교 
'''
# _years = list(map(str, range(2010, 2018)))
# df_4 = df_seoul.loc[['충청남도','경상북도', '강원도', '전라남도'], _years]
# df_4['합계'] = df_4.sum(axis = 1)
# total = df_4[['합계']].sort_values(by = '합계', ascending = True)
# total.plot(kind='barh', figsize=(20, 10), width=0.7,
#          color=['blue'])
         
# plt.title('서울 -> 타시도 인구 이동', size=30) # fontproperties=mg_30
# plt.ylabel('전입지', size=20) # fontproperties=mg_20
# plt.xlabel('인구 이동수', size=20) # fontproperties=mg_20
# plt.legend(loc='best', fontsize=15) # prop=mg_15
# plt.show()


'''
<보조 축 활용> 

-지금까지 그래프는 하나의 y축 활용
-보조축을 추가하여 2개의 y축을 갖는 그래프 생성
'''
df_ns = pd.read_excel("C:/Users/Hoon/Desktop/엔코아 파이썬/데이터 시각화/남북한발전전력량.xlsx")
df_ns.fillna(method='ffill',inplace=True)

# 한글 폰트 세팅
font_path = "./malgun.TTF"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)
col_years = list(map(str, range(1990, 2017)))
#북한 데이터만 가져오기
df_ns = df_ns.iloc[5:]
#전력량 컬럼 삭제 
df_ns.drop('전력량 (억㎾h)',axis=1,inplace=True)
#발전 전력별 컬럼을 인덱스로 지정
df_ns.set_index('발전 전력별',inplace=True)
#데이터프레임 전치
df_ns = df_ns.T 
#증감률을 계산하기 위해 '합계'열의 이름을 '총발전량'으로 변경
df_ns.rename({'합계':'총발전량'},axis=1 ,inplace=True)
df_ns['총발전량 -1년'] = df_ns['총발전량'].shift(1)
#두 열의 데이터를 이용하여 전년도 대비 변동율을 계산한 결과를 '증감률'열에 저장
df_ns['증감률'] =(df_ns['총발전량'] / df_ns['총발전량 -1년'] -1)*100
ax1 = df_ns[['수력','화력']].plot(kind='bar',stacked=True, figsize=(20, 10), width=0.7,
         color=['red', 'blue'])
ax1.set_ylim(0,500)
ax2 = ax1.twinx()
ax2.set_ylim(-50,50)
ax2.plot(col_years, df_ns['증감률'],marker='o',markerfacecolor='green',markersize=10, color='green',linewidth=2,ls='--')
plt.title('북한 전력 발전량(1990~2016)', size=30) # fontproperties=mg_30
ax1.set_ylabel('발전량 (억㎾h)', size=20) # fontproperties=mg_20
ax2.set_ylabel('전년대비 증감율', size=20) # fontproperties=mg_20
plt.xlabel('연도', size=20) # fontproperties=mg_20
# plt.show()
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유