[시각화 도구/Matplotlib - 기본 그래프 도구] 막대 그래프
막대 그래프는 데이터 값의 크기에 비례하여 높이를 갖는 직사각형 막대로 표현한다.
세로형과 가로형 막대 그래프 두 종류가 있다. 다만, 세로형의 경우 정보 제공 측면에서 보면 선 그래프와 큰 차이가 없다.
세로형 막대 그래프는 시간적으로 차이가 나는 두 점에서 데이터 값의 차이를 잘 설명한다.
즉, 시계열 데이터를 표현하는데 적합하다.
plot() 메소드에 kind='bar' 옵션을 입력한다.
# 예제 4-16
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
font_path = 'C:\Windows\Fonts\malgunsl.ttf'
font_name = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font_name)
df = pd.read_excel('시도별 전출입 인구수.xlsx', engine='openpyxl', header=0)
df = df.fillna(method='ffill')
mask = (df['전출지별'] == '서울특별시') & (df['전입지별'] != '서울특별시')
df_seoul = df[mask]
df_seoul = df_seoul.drop(['전출지별'], axis=1)
df_seoul.rename({'전입지별': '전입지'}, axis=1, inplace=True)
df_seoul.set_index('전입지', inplace=True)
col_years = list(map(str, range(2010, 2018)))
df_4 = df_seoul.loc[['충청남도', '경상북도', '강원도', '전라남도'], col_years]
df_4 = df_4.transpose()
plt.style.use('ggplot')
df_4.index = df_4.index.map(int)
df_4.plot(kind='bar', figsize=(20, 10), width=0.7, color=['orange', 'green', 'skyblue', 'blue'])
plt.title('서울 -> 타시도 인구 이동', size=30)
plt.ylabel('이동 인구 수', size=20)
plt.xlabel('기간', size=20)
plt.ylim(5000, 30000)
plt.legend(loc='best', fontsize=15)
plt.show()
plot() 메소드의 color 옵션을 추가하여 막대 색상을 다르게 설정한다.
가로형 막대 그래프는 각 변수 사이 값의 크기 차이를 설명하는데 적합하다.
plot() 메소드의 옵션으로 kind='barh' 를 입력한다.
# 예제 4-17
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
font_path = 'C:\Windows\Fonts\malgunsl.ttf'
font_name = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font_name)
df = pd.read_excel('시도별 전출입 인구수.xlsx', engine='openpyxl', header=0)
df = df.fillna(method='ffill')
mask = (df['전출지별'] == '서울특별시') & (df['전입지별'] != '서울특별시')
df_seoul = df[mask]
df_seoul = df_seoul.drop(['전출지별'], axis=1)
df_seoul.rename({'전입지별': '전입지'}, axis=1, inplace=True)
df_seoul.set_index('전입지', inplace=True)
col_years = list(map(str, range(2010, 2018)))
df_4 = df_seoul.loc[['충청남도', '경상북도', '강원도', '전라남도'], col_years]
df_4['합계'] = df_4.sum(axis=1)
df_total = df_4[['합계']].sort_values(by='합계', ascending=True)
plt.style.use('ggplot')
df_total.plot(kind='barh', color='cornflowerblue', width=0.5, figsize=(10, 5))
plt.title('서울 -> 타시도 인구 이동')
plt.ylabel('전입지')
plt.xlabel('이동 인구 수')
plt.show()
2010~2017년의 기간 동안 서울에서 각 시도로 이동한 인구의 합계를 구하여 시도별로 비교하는 그래프를 그린다.
2010~2017년에 이동 인구 합계를 기준으로 서울에서 충청남도로 이동한 사림이 가장 많은 것을 확인할 수 있다.
※ 보조 축 활용하기(2축 그래프 그리기)
지금까지 그래프를 그릴 때 y축을 한 개만 사용하였다.
Excel에서 차트를 그릴 때처럼 보조 축을 추가하여 2개의 y축을 갖는 그래프를 그릴 수 있다.
남북한 발전량 데이터셋을 사용하여 보조 축을 설정하는 방법을 살펴본다.
기존 축에는 막대 그래프의 값을 표시하고 보조 축에는 선 그래프의 값을 표시한다.
막대 그래프는 연도별 북한의 발전량을 나타내고 선 그래프는 북한 발전량의 전년 대비 증감률을 백분률로 나타낸다.
# 예제 4-18
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
font_path = 'C:\Windows\Fonts\malgunsl.ttf'
font_name = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font_name)
plt.style.use('ggplot')
plt.rcParams['axes.unicode_minus']=False # 마이너스 부호 출력
df = pd.read_excel('남북한발전전력량.xlsx', engine='openpyxl', convert_float=True)
df = df.loc[5:9]
df.drop('전력량 (억㎾h)', axis='columns', inplace=True)
df.set_index('발전 전력별', inplace=True)
df = df.T
df = df.rename(columns={'합계':'총발전량'})
df['총발전량 - 1년'] = df['총발전량'].shift(1)
df['증감률'] = ((df['총발전량']/df['총발전량 - 1년']) - 1) * 100
ax1 = df[['수력', '화력']].plot(kind='bar', figsize=(20, 10), width=0.7, stacked=True)
ax2 = ax1.twinx()
ax2.plot(df.index, df.증감률, ls='--', marker='o', markersize=20, color='green', label='전년대비 증감률(%)')
ax1.set_ylim(0, 500)
ax2.set_ylim(-50, 50)
ax1.set_xlabel('연도', size=20)
ax1.set_ylabel('발전량(억 kWh)')
ax2.set_ylabel('전년 대비 증감률(%)')
plt.title('북한 전력 발전량(1990~2016)', size=30)
ax1.legend(loc='upper left')
plt.show()
증감률을 계산하기 위해 rename() 메소드로 '합계'열의 이름을 '총발전량'으로 바꾸고, shift() 메소드를 이용하여 '총발전량'열의 데이터를 1행씩 뒤로 이동시켜서 '총발전량 - 1년'열을 새로 생성한다.
그리고 두 열의 데이터를 이용하여 전년도 대비 변동율을 계산한 결과를 '증감률'열에 저장한다.
ax1 객체는 막대 그래프에 stacked=True 옵션을 지정하여, '수력', '화력'열의 값을 아래 위로 쌓은 형태의 세로형 막대 그래프를 그린다.
ax1 객체에 twinx() 메소드를 적용하여 ax1 객체의 쌍둥이 객체를 만들고, 쌍둥이 객체를 ax2 변수에 저장한다.
ax2 객체에 plot() 메소드를 적용하여 선 그래프를 그린다. 그래프를 그리는데 사용할 데이터는 '증감률'열에서 가져온다.
2015년 수력 발전량이 일시적으로 급감한 사실이 있다. 기사를 검색해 보면 2015년에 북한의 가뭄이 심각했다는 뉴스를 찾아볼 수 있다.
![]() |
|
'공부 > 파이썬 머신러닝 판다스 데이터 분석' 카테고리의 다른 글
[시각화 도구/Matplotlib - 기본 그래프 도구] 산점도 (0) | 2022.11.17 |
---|---|
[시각화 도구/Matplotlib - 기본 그래프 도구] 히스토그램 (0) | 2022.11.17 |
[시각화 도구/Matplotlib - 기본 그래프 도구] 면적 그래프 (0) | 2022.11.16 |
[시각화 도구/Matplotlib - 기본 그래프 도구] 선 그래프 (0) | 2022.11.08 |
[데이터 살펴보기/판다스 내장 그래프 도구 활용] (0) | 2022.10.28 |