이번에는 Matplotlib을 통해서 바 차트를 그리는 방법에 대해서 알아봅시다.
우선 주류 데이터가 아닌 임의의 데이터를 가지고 바 차트를 그리는 연습을 해볼게요.
import matplotlib.pyplot as plt
바 차트를 그리는 가장 쉬운 방법은 plt.bar()를 사용하는 것입니다.
이번에는 바 차트를 그리기 위해서 세 가지 리스트를 사용합니다.
바의 위치를 결정하는 인덱스,
바 차트로 사용할 데이터의 이름이 담긴 리스트(레이블),
그리고 해당 이름에 해당하는 데이터의 값이 담긴 리스트(실질적인 데이터)
아래의 코드에서는 각각 index, years, values에 해당되겠습니다
▶ [코드스니펫] 바그래프 예제
# 여기서 index 값인 0, 1, 2는 순차적으로 어디에 배치될 것인지를 의미합니다.
# 어떤 의미인지 궁금하다면 0, 1, 5로 바꿔서 실행해보세요!
index = [0, 1, 2]
years = ['2017', '2018', '2019']
values = [100, 400, 900]
plt.bar(index, values, width=0.2, color='g')
plt.xticks(index, years)
plt.show()

인덱스는 숫자 0부터 시작하는데, 인덱스의 의미를 이해하는 가장 좋은 방법은 인덱스의 숫자를 바꿔보는 것입니다. 인덱스를 [0, 1, 2]가 아니라 [0, 1, 5]로 바꿔보겠습니다.
index = [0, 1, 5]
years = ['2017', '2018', '2019']
values = [100, 400, 900]
plt.bar(index, values, width=0.2, color='g')
plt.xticks(index, years)
plt.show()

2019년 데이터가 5번 위치로 이동하면서 2번, 3번, 4번의 위치에 데이터 공백이 생겨서 위와 같은 결과가 출력되게 됩니다. 예를 들어서 데이터의 개수가 16개라면 다음과 같인 index 리스트를 작성해주면 될 것입니다.
index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
그런데 이걸 일일히 0부터 작성해주는 것은 너무 비효율적입니다. 그래서 이를 자동화하고자 한다면 Numpy라는 패키지의 arange()라는 함수를 사용할 수 있습니다.
import numpy as np
arange()는 입력으로 숫자를 넣으면 0부터 해당 숫자 전까지의 숫자 리스트를 만듭니다.
예를 들어 3을 넣으면 0, 1, 2의 숫자 리스트를 만드니다.
index = np.arange(3)
print(index)
>>>>>>>>>>>>>>>>>>>>>>실행>>>>>>>>>>>>
[0 1 2]
위에서 Numpy의 arange 함수를 통해 얻은 리스트를 입력으로 다시 차트를 그려봅시다.
years = ['2017', '2018', '2019']
values = [100, 400, 900]
plt.bar(index, values, width=0.2, color='g')
plt.xticks(index, years)
plt.show()

처음과 동일한 결과를 얻습니다. 앞으로는 데이터의 개수가 n개라면 arange(n)을 사용하고,
이를 index로 저장해서 차트를 그리면 좀 더 편하겠지요?
주류 데이터의 대륙 별 beer_servings의 평균, 최소, 최대, 합계에 대한 바 차트를 그려봅시다.
우선 groupby를 통해서 통계 데이터를 얻습니다.
▶ [코드스니펫] 주류데이터 대륙별 데이터
drink_df.groupby('continent').beer_servings.agg
(['mean', 'min', 'max', 'sum'])

위 데이터프레임의 인덱스는 맨 좌측의 continent입니다.
위 데이터프레임을 beer_servings_table라는 이름의 변수에 저장합니다.
beer_servings_table = drink_df.groupby('continent').beer_servings.agg
(['mean', 'min', 'max', 'sum'])
>>>>>>>>>>>>>>>>>>>>>실행>>>>>>>>>>>..
['AF', 'AS', 'ETC', 'EU', 'OC', 'SA']
이 값은 바 차트에서 x축에 기재될 레이블로 사용될 것 입니다. 이제 바 차트에서 실질적인 데이터 리스트를 얻어봅시다. 우선, 평균값은 다음과 같이 얻을 수 있습니다.
beer_servings_table['mean'].to_list()
>>>>>>>>>>>>>>>>>>실행>>>>>>>>>>>>>>>>>
[61.471698113207545,
37.04545454545455,
145.43478260869566,
193.77777777777777,
89.6875,
175.08333333333334]
최솟값의 리스트는 다음과 같이 얻을 수 있습니다.
beer_servings_table['min'].to_list()
>>>>>>>>>>>>>>>실행>>>>>>>>>>>>>>>>>>
[0, 0, 1, 0, 0, 93]
최댓값의 리스트는 다음과 같이 얻을 수 있습니다.
beer_servings_table['max'].to_list()
>>>>>>>>>>>>>>>실행>>>>>>>>>>>>>>>>>>
[376, 247, 285, 361, 306, 333]
합의 리스트는 다음과 같이 얻을 수 있습니다.
beer_servings_table['sum'].to_list()
>>>>>>>>>>>>>>>실행>>>>>>>>>>>>>>>>>>
[3258, 1630, 3345, 8720, 1435, 2101]
각 대륙의 이름(레이블)과 각 통계치(실질적인 데이터)를 확인하였으니 이제 이를 바탕으로 바 차트를 그리면 됩니다! 그런데 아직 남은 준비물이 있으니 바로 인덱스 리스트입니다.
대륙의 개수가 6개이므로 다음과 같이 리스트를 구성할 수 있습니다.
[0, 1, 2, 3, 4, 5]
하지만 이번에는 대륙의 수가 달라지더라도 자동으로 인덱스를 구성할 수 있도록, 앞서 배운 arange 함수로 얻어봅시다. 대륙의 이름들이 들어가 있는 리스트의 길이를 카운트하면 대륙의 수가 나오겠지요? 길이를 재는 len 함수를 이용해 대륙의 개수를 구합니다.
len(beer_servings_table.index.to_list())
>>>>>>>>>>>>>>>실행>>>>>>>>>>>>>>>>>>
6
그리고 이 수를 arange()의 입력으로 하여 레이블의 개수를 구합니다.
index = np.arange(len(beer_servings_table.index.to_list()))
index
>>>>>>>>>>>>>>>실행>>>>>>>>>>>>>>>>>>
array([0, 1, 2, 3, 4, 5])
0부터 5까지 총 6개의 원소가 순차적으로 들어가있는 정수의 리스트를 얻습니다.
이제 각 대륙의 평균 맥주 소비량을 바 차트로 표현해봅시다.
continents = beer_servings_table.index.to_list()
values = beer_servings_table['mean'].to_list()
plt.bar(index, values, width=0.2, color='g')
plt.xticks(index, continents)
plt.show()

이제 mean대신 min, max, sum 등을 넣으면 최솟값에 대해서 최댓값에 대해서 합계에 대해서 바 차트를 표현할 수 있을 겁니다. 하지만, 엄연히 다른 수치이므로 plt.bar의 color의 값을 바꿔주므로서 색깔을 바꾸면서 그려보겠습니다. 이는 color의 값을 바꿔주므로서 가능합니다.
위의 경우에는 color의 값이 'g'였는데, 이는 green을 나타내므로 초록색이었습니다.
max를 사용해봅시다. 그리고 color의 값을 'r'로 지정해봅시다. 이는 red를 의미합니다.
continents = beer_servings_table.index.to_list()
values = beer_servings_table['max'].to_list()
plt.bar(index, values, width=0.2, color='r')
plt.xticks(index, continents)
plt.show()

min을 사용해봅시다. 그리고 color의 값을 'b'로 지정해봅시다. 이는 blue를 의미합니다.
continents = beer_servings_table.index.to_list()
values = beer_servings_table['min'].to_list()
plt.bar(index, values, width=0.2, color='b')
plt.xticks(index, continents)
plt.show()

이번에는 y축 레이블과 차트 제목도 추가해보겠습니다. 이는 각각 ylabel과 title로 가능합니다.
continents = beer_servings_table.index.to_list()
values = beer_servings_table['sum'].to_list()
# y축 레이블과 바차트 제목 추가
plt.ylabel('beer_servings')
plt.title('beer_servings by continents')
plt.bar(index, values, width=0.2, color='y')
plt.xticks(index, continents)
plt.show()
