조금씩 꾸준히 완성을 향해

[Matplotlib] 다양한 그래프 그리기(면적그래프, 막대그래프, 보조축 활용) 본문

Python/데이터 시각화

[Matplotlib] 다양한 그래프 그리기(면적그래프, 막대그래프, 보조축 활용)

all_sound 2022. 10. 1. 16:05

면적 그래프


  • Area plot : 각 열의 데이터를 선 그래프로 구현 후 선 그래프와 x축 공간에 색을 입힌다.
  • 색의 투명도(alpha)는 기본값 0.5로 투과되어 보임(투명도 0~1범위)
  • plot(kind='area')
  • stacked=True : 그래프를 누적할지 여부 설정
df_4.plot(kind='area', stacked=False, alpha=0.3, figsize=(15, 7))
plt.title('서울 -> 타시도 인구 이동', fontproperties=mg_20) 
plt.ylabel('이동 인구 수',fontproperties=mg_15) 
plt.xlabel('기간', fontproperties=mg_15) 
plt.legend(loc='best',  prop=mg_10) 
plt.show()

# stacked=True인 면적그래프 객체를 ax 객체로 설정하여 세부적인 요소 설정

# 면적 그래프 axe 객체 생성
ax = df_4.plot(kind='area', stacked=True, alpha=0.2, figsize=(15, 7))

# axe 객체 설정 변경
ax.set_title('서울 -> 타시도 인구 이동', fontproperties=mg_30, color='brown', weight='bold') 
ax.set_ylabel('이동 인구 수', fontproperties=mg_20, color='blue') 
ax.set_xlabel('기간', fontproperties=mg_20, color='blue') 
ax.legend(loc='best', prop=mg_15) 
plt.show()

 

막대 그래프


  • 데이터 값의 크기에 비례하여 높이를 갖는 직사각형 막대로 표현
  • 막대 높이의 상대적 길이 차이를 통해 데이터 분석


▶ 세로형 막대그래프

  • plot(kind='bar')
  • 정보 제공 측면에서 선그래프와 큰 차이 없음
  • 세로형 막대 그래프는 시간적으로 차이가 나는 두 점에서 데이터 값의 차이를 잘 설명해줌
  • 즉, 시계열 데이터를 표현하는 데 적합
df_4.head(4) #사용할 데이터 확인

df_4.loc['2010':].plot(kind='bar', figsize=(15, 7), width=0.7, 
			color=['orange', 'olive', 'skyblue', 'pink'])
plt.ylim(0,30000)
plt.title('서울 -> 타시도 인구 이동', fontproperties=mg_20) 
plt.ylabel('이동 인구 수',fontproperties=mg_15) 
plt.xlabel('기간', fontproperties=mg_15) 
plt.xticks(rotation=70)
plt.legend(loc='best',  prop=mg_10) 
plt.show()

 

▶ 가로형 막대그래프

  • plot(kind='barh')
  • 각 변수 사이 값의 크기 차이를 설명하는 데 적합


* 2010~2017년 서울에서 각 시도로 이동한 인구의 합계를 비교

# 2010년~2017년 서울에서 4개 지역으로 이동한 데이터 추출
col_years = list(map(str, range(2010, 2018)))
df_4 = df_seoul.loc[['충청남도','경상북도', '강원도', '전라남도'], col_years]
print(df_4.head(5))

# 합계 열 추가 후, 변수로 저장
df_4['합계'] = df_4.sum(axis=1)
df_total = df_4[['합계']].sort_values(by='합계', ascending=True) # 가장 큰 값부터 정렬

col_years = list(map(str, range(2010, 2018)))
df_4 = df_seoul.loc[['충청남도','경상북도', '강원도', '전라남도'], col_years]
print(df_4.head(5))
df_4['합계'] = df_4.sum(axis=1)

df_total = df_4[['합계']].sort_values(by='합계', ascending=True) # 가장 큰 값부터 정렬

df_total.plot(kind='barh', color='cornflowerblue', width=0.5, figsize=(10, 5))
plt.yticks(fontproperties=mg_10)
plt.title('서울 -> 타시도 인구 이동', fontproperties=mg_30)
plt.ylabel('전입지', fontproperties=mg_20)
plt.xlabel('이동 인구 수', fontproperties=mg_20)
plt.legend(loc='best',prop=mg_15)
plt.show()



보조축 활용


보조축을 추가하여 2개의 y축을 갖는 그래프 생성

df.head(5) #사용할 데이터 확인


▶ shift() : 총발전량 열의 데이터를 1행씩 뒤로 이동시켜서 총발전량-1 열을 새로 생성

df['총발전량-1년'] = df['총발전량'].shift(1)
df.head(5)

# 발전량 증감률 계산해서 추가
df['증감률']= df['총발전량']/df['총발전량-1년']*100-100
df.head(5)


▶ twinx() 메소드 : 쌍둥이 객체 생성 후 ax2에 저장

ax1 = df[['수력', '화력']].plot(kind='bar', stacked=True, figsize=(15,8))
ax2 = ax1.twinx()  #쌍둥이 객체 생성
ax2.plot(df.index, df['증감률'].values, ls='--', color='green', marker='o',markersize=10 )

ax1.set_ylim(0,500)
ax2.set_ylim(-50, 50)

ax1.set_xlabel('연도', fontproperties=mg_15)
ax1.set_ylabel('발전량(억 kWh', fontproperties=mg_15)
ax2.set_ylabel('전년 대비 증감률(%)', fontproperties=mg_15)
plt.title('북한 전력 발전량', fontproperties=mg_20)
ax1.legend(loc='best', prop=mg_15)

plt.show()