상세 컨텐츠

본문 제목

[Python](matplotlib) 막대 그래프 그리기

파이썬 배우기 - (ver.1)/시각화 기초

by 콩알맹이 2024. 2. 26. 10:18

본문

이전 글에서 .plot()을 이용하여 matplotlib 시각화 메소드에 대한 기초를 알아보고 꺾은선 그래프를 그려봤다.

이번 글에서는 .bar()를 이용하여 막대 그래프를 그려볼 것이다.

 

혹시라도 아직 matplotlib 라이브러리의 시각화 메소드 기초에 대해 익숙하지 않다면 아래 링크를 통해 다시 살펴보도록 하자.

 

시각화 기초 링크 : https://kongalmengi.tistory.com/23

 

[Python](matplotlib) 시각화 기초 & 꺾은선 그래프 그리기

여기서는 matplotlib 라이브러리를 이용하여 데이터를 시각화하는 방법에 대해 알아볼 것이다. 1. matplotlib 라이브러리 불러오기 먼저 matplotlib 라이브러리를 다음과 같이 불러오자. import matplotlib as m

kongalmengi.tistory.com

 

 

1. 라이브러리 불러오기

 

시각화를 위해 matplotlib 라이브러리와, 해당 라이브러리의 pyplot 모듈을 불러와야 한다.

이번에는 DataFrame 타입의 데이터를 다루므로 pandas 라이브러리도 불러와야 한다.

그리고 numpy 라이브러리의 함수도 이용할 계획이니 numpy 라이브러리도 불러온다.

import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

 

 

2. 데이터 불러오기

 

이제 시각화에 이용할 데이터가 필요하다.

데이터는 이전에 .groupby() 메소드의 예제에 사용했던 햄스터 자료, Ham_df를 이용할 것이다.

 

링크 : https://kongalmengi.tistory.com/22

 

[Python](Pandas) .groupby() 메소드

이번에는 Pandas 라이브러리에서 제공되는 .groupby() 메소드에 대해 알아볼 것이다. groupby() 메소드는 DataFrame을 특정 열을 기준으로 그룹화 하는데 사용된다. 이렇게 그룹화된 데이터에 집계함수(agg

kongalmengi.tistory.com

 

Ham_df를 불러오자.

Ham_df

 

 

3. 시각화

 

I. 막대 그래프 그리기

햄스터들이 집에 모은 아몬드의 양을 막대 그래프로 나타낼 것이다.

막대 그래프를 만들기 위해서는 .bar() 메소드를 이용해야 하는데, 기본적인 사용법은 아래와 같다.

 

- .bar()의 사용법 : .bar(x축 데이터, y축 데이터, 막대의 너비)

 

막대 그래프 메소드에서는 x축, y축 데이터 뿐만 아니라, 막대의 너비도 설정할 수 있다.

키워드를 입력하지 않은 경우에는 위의 사용법에서 알 수 있듯이 3번째 전달값이 막대의 너비를 의미하며, 키워드는 'width'다.

 

본론으로 돌아와서, 여기서 x축 데이터는 햄스터의 이름, y축 데이터는 아몬드의 갯수로 설정할 것이다.

그리고 label 파라미터에 '아몬드'를 입력하여 다음과 같이 시각화 코드를 구성할 수 있다.

fig, ax = plt.subplots()

# 그래프 제목
ax.set_title('햄스터가 모은 먹이')

# 막대 그래프 함수
ax.bar(Ham_df['이름'], Ham_df['아몬드'], label='아몬드', color='darkgreen')

# x축 설정
ax.set_xticks(Ham_df['이름'], Ham_df['이름'], rotation=45)

# y축 제목 설정
ax.set_ylabel('아몬드(개)')

# 범례
ax.legend()

plt.show()

 

이렇게 햄스터들이 모은 아몬드를 막대 그래프로 표현하였다.

여기에 사용된 메소드는 모두 시각화 기초에서 다룬 것들이므로 코드 자체에 복잡하거나 어려운 부분은 없다.

다만 x축 설정에 대해 조금 설명할 부분이 있다.

 

x축 설정은 .set_xticks() 메소드를 이용하였는데, 사실 이 메소드를 사용하지 않아도 이미 .bar()에 x축 데이터를 정확히 전달하였기 때문에 x축에는 햄스터들의 이름이 정상적으로 출력된다.

그럼에도 .set_xticks()를 이용한 이유는, rotation 파라미터를 사용하기 위함이다.

 

추가로, .set_xticks()를 이용할 때는, 실제 x축 데이터와 표시할 문자열을 반드시 전달해줘야 한다.

만약 rotation 옵션만 이용할 생각이라 ax.set_xticks(rotation=45) 이렇게만 입력한다면 해당 코드에서 오류가 발생하니 사용에 주의해야 한다.

 

 

II. 2가지 항목을 비교하는 막대그래프 그리기

i) 겹쳐진 그래프

앞에서 '아몬드'에 대한 막대 그래프를 그렸다.

이번에는 여기에 '땅콩' 항목을 추가하여, 두 데이터를 비교할 수 있는 막대 그래프를 그릴 것이다.

 

'아몬드'와 '땅콩', 이렇게 2가지에 대한 막대그래프를 그리기 위해서는 시각화 메소드 또한 2개가 필요하다.

그럼 이러한 점을 고려하여, 앞에서 만든 코드에 .bar()를 하나 더 추가하여 '땅콩'에 대한 그래프를 함께 그려보자.

fig, ax = plt.subplots()

# 그래프 제목
ax.set_title('햄스터가 모은 먹이')

# 막대 그래프 함수
ax.bar(Ham_df['이름'], Ham_df['아몬드'], label='아몬드', color='darkgreen')
ax.bar(Ham_df['이름'], Ham_df['땅콩'], label='땅콩') # 땅콩 그래프 추가

# x축 설정
ax.set_xticks(Ham_df['이름'], Ham_df['이름'], rotation=45)

# y축 제목 설정
ax.set_ylabel('아몬드(개)')

# 범례
ax.legend()

plt.show()

 

그래프 결과가 나오긴 했는데, 그냥 두 그래프가 겹쳐져 출력되었다.

이런 그래프를 원한 것이 아니다.

원래 의도했던 것은, 비교하기 쉽게 햄스터의 이름마다 '땅콩'과 '아몬드'의 항목이 나란히 붙어있는 막대그래프였다.

이 문제를 어떻게 해결해야 좋을까?

 

ii) 문제 해결

이러한 문제는 x축 데이터를 다시 설정하는 것으로 해결할 수 있다.

다음과 같이 x축에 변화를 주어 코드를 완성시켜보자.

fig, ax = plt.subplots()

# 그래프 제목
ax.set_title('햄스터가 모은 먹이')

# 막대 그래프의 너비 설정
bar_width = 0.35

# 막대 그래프 함수
ax.bar(np.arange(len(Ham_df['이름'])), Ham_df['아몬드'], width=bar_width, label='아몬드')
ax.bar(np.arange(len(Ham_df['이름'])) + bar_width, Ham_df['땅콩'], width=bar_width, label='땅콩')

# x축 설정
ax.set_xticks(np.arange(len(Ham_df['이름'])) + bar_width / 2, Ham_df['이름'], rotation=45)

# y축 제목 설정
ax.set_ylabel('갯수')

# 범례
ax.legend(loc='upper right')

plt.show()

 

이제 좀 '땅콩'과 '아몬드'를 비교할 수 있는, 제대로 된 그래프를 얻었다.

이를 위해 x축 데이터를 다시 설정했다고 했는데, 어떻게 재설정을 했다는 것인가?

 

x축의 변화가 코드상으로는 직관적으로 눈에 들어오지 않을 수 있다.

이런 경우에는 x축 데이터를 직접 출력하여 살펴보면 된다.

그럼 막대 그래프에 사용된 x축 데이터를 확인해보자.

print(f'아몬드의 x축 : {np.arange(len(Ham_df['이름']))}')
print(f'땅콩의 x축 : {np.arange(len(Ham_df['이름'])) + bar_width}')
print(f'그래프상의 x축 눈금 위치 : {np.arange(len(Ham_df['이름'])) + bar_width / 2}')

아몬드의 x축 : [0 1 2 3 4 5 6 7 8 9]
땅콩의 x축 : [0.35 1.35 2.35 3.35 4.35 5.35 6.35 7.35 8.35 9.35]

그래프상의 x축 눈금 위치 : [0.175 1.175 2.175 3.175 4.175 5.175 6.175 7.175 8.175 9.175]

 

일반적으로 위의 비교 그래프를 보면, '아몬드'의 x값과 '땅콩'의 x값이 같다고 생각할 것이다.

하지만 x축 데이터를 숫자에 대응시켜보니 모두가 다르다. 심지어 x축의 눈금까지도 '아몬드'나 '땅콩'의 x축 데이터와 다르다.

이 x축 데이터가 의미하는 바를 정리해보자면 아래와 같다.

 

※ x축 데이터 정리

- '아몬드' 그래프에 사용된 x축 데이터 : 숫자 [1, 2, 3, 4, 5, ..., 9]에 대응된다.

- '땅콩' 그래프에 사용된 x축 데이터 : 막대 너비(0.35)만큼 +방향으로 이동하여, 숫자 [0.35, 1.35, 2.35, ..., 9.35]에 대응된다.

- 그래프 상에서 x축의 눈금 위치 : '아몬드'의 x축 데이터에서 막대 너비(0.35)의 절반만큼 이동하여 '아몬드'와 '땅콩'의 중간 위치에 존재한다. [0.175, 1.175, 2.275, ..., 9.175]

 

그래프만 봤을 때는 당연히 '아몬드'와 '땅콩'의 x값은 서로 같은 값에 대응된다고 생각이 들지만, 코드상에서는 아님을 확인할 수 있다.

별도의 비교 옵션이 존재하는 것이 아니라, x축 데이터를 직접 조정하여 비교형 그래프를 만드는 것이다.

 

 

이렇게 matplotlib 라이브러리를 이용할 때, 비교형 막대 그래프를 만드는 법 까지 알아봤다.

다음 글 에서는 파이형 차트를 그려보자.

관련글 더보기