본문 바로가기
데이터 분석/시각화

[바 차트(Bar chart)] 2. Matplotlib을 이용하여 바 차트 꾸미기

by 부자 꽁냥이 2020. 6. 8.

안녕하세요~ '꽁냥이'입니다.

 

[바 차트(Bar chart)] 1. Matplotlib을 이용하여 바 차트, 수평 바 차트 그리기에 이어서 이번 포스팅에서는 Matplotlib을 이용하여 바 차트를 좀 더 예쁘게 꾸며보는 방법에 대해 소개하고요~

 

이번 포스팅 내용은 다음과 같습니당~

 

1. 막대기 색상 변경

2. 막대기 테두리 설정

3. 막대기에 텍스트 추가하기

LIST

   1. 막대기 색상 변경

바 차트의 막대기 색깔은 bar메서드에서 color라는 인자를 이용하여 변경할 수 있습니다. 

 

bar( . . . , color)

 

오늘 사용할 코드는 저번 포스팅에서 사용했던 코드를 그대로 사용했고 막대기 색깔만 초록색으로 지정(13번째 줄)했습니당~

import matplotlib.pyplot as plt

## 데이터
age_category = ['10대 이하', '20대', '30대', '40대', '50대', '60대 이상'] ## 연령 카테고리, x축 눈금에 표시될 라벨
num_patient = [3,3,5,7,8,9] ## 방문환자수

## 시각화
plt.figure(figsize=(10,10)) ## Figure 생성 사이즈는 10 by 10
xtick_label_position = list(range(len(age_category))) ## x축 눈금 라벨이 표시될 x좌표
plt.xticks(xtick_label_position, age_category) ## x축 눈금 라벨 출력

## 바 차트 출력, 막대기 색깔을 초록색으로 설정
plt.bar(xtick_label_position, num_patient, color='green')

plt.title('지난달 연령별 방문환자 수',fontsize=20) ## 타이틀 출력
plt.xlabel('연령') ## x축 라벨 출력
plt.ylabel('방문환자수') ## y축 라벨 출력
plt.show()

위 코드를 실행하면 아래와 같이 초록색으로 잘 바뀐 것을 알 수 있습니다.

 

color 인자가 취할 수 있는 색상은 아래의 리스트를 참고하셔서 맘에 드는 색상을 사용하세용~

 

색상 리스트 : https://matplotlib.org/3.2.1/gallery/color/named_colors.html

 

지금까지는 하나의 색상을 모든 막대기에 적용했지만 상황에 따라서 막대기마다 다른 색깔을 적용하고 싶을 때가 있을 거예요~

이럴 때는 원하는 색깔을 color에 리스트로 넘겨주면 되는데요~ colors라는 리스트로 카테고리 개수만큼 원하는 색상을 넣어주고 이를 bar메서드 안에 color인자에 넘겨주겠습니다.

colors = ['black','dimgray','dimgrey','darkgray','silver','lightgrey'] ## 색상 지정

plt.bar(xtick_label_position, num_patient, color=colors) ## 바 차트 출력

전체 코드는 다음과 같습니다.

import matplotlib.pyplot as plt

## 데이터
age_category = ['10대 이하', '20대', '30대', '40대', '50대', '60대 이상'] ## 연령 카테고리, x축 눈금에 표시될 라벨
num_patient = [3,3,5,7,8,9] ## 방문환자수

## 시각화
plt.figure(figsize=(10,10)) ## Figure 생성 사이즈는 10 by 10
colors = ['black','dimgray','dimgrey','darkgray','silver','lightgrey'] ## 색상 지정
xtick_label_position = list(range(len(age_category))) ## x축 눈금 라벨이 표시될 x좌표
plt.xticks(xtick_label_position, age_category) ## x축 눈금 라벨 출력

plt.bar(xtick_label_position, num_patient, color=colors) ## 바 차트 출력

plt.title('지난달 연령별 방문환자 수',fontsize=20) ## 타이틀 출력
plt.xlabel('연령') ## x축 라벨 출력
plt.ylabel('방문환자수') ## y축 라벨 출력
plt.show()

위 코드를 실행하면 아래와 같이 막대기 별로 색상이 적용된 것을 확인할 수 있습니다.

근데 카테고리 개수가 적으면 상관없지만 많을 경우에는 색상을 하나하나 타이핑해서 리스트로 만들어 주는 것이 번거로울 수 있는데요. seaborn이라는 모듈에는 카테고리 개수만큼 색상을 알아서 만들어주는 유용한 녀석이 있답니다~

바로 color_palette 메서드인데요. 꽁냥이가 실제로 많이 사용하는 방법이에요~ 

color_palette의 기본적인 사용 형식은 다음과 같습니다.

 

color_palette(파레트, 색상 개수)

 

seaborn 모듈은 matplotlib과 마찬가지로 파이썬에서 유명한 시각화 라이브러리인데요. 데이터 분석과 관련하여 유명한 라이브러리인 pandas의 DataFrame형식의 데이터를 시각화하는데 많이 사용됩니당~

 

꽁냥이는 파레트는 'hls', 색상 개수는 연령 카테고리의 개수로 지정했습니다('hls'파레트는 사용하기에 가장 무난하고 예뻐서 꽁냥이가 애용한답니당).

colors = sns.color_palette('hls',len(age_category)) ## 색상 지정

파레트의 종류는 굉장히 많답니당~ 아래의 사이트를 링크해드릴 테니 참고하셔서 사용하시면 됩니당~

 

파레트 종류 : https://matplotlib.org/3.1.1/gallery/color/colormap_reference.html

 

Colormap reference — Matplotlib 3.1.2 documentation

Note Click here to download the full example code Colormap reference Reference for colormaps included with Matplotlib. A reversed version of each of these colormaps is available by appending _r to the name, e.g., viridis_r. See Choosing Colormaps in Matplo

matplotlib.org

color_palette 사용 예제 : https://seaborn.pydata.org/generated/seaborn.color_palette.html#seaborn.color_palette

 

seaborn.color_palette — seaborn 0.10.1 documentation

deep, muted, bright, pastel, dark, colorblind

seaborn.pydata.org

전체 코드와 실행 결과는 다음과 같아요~

import matplotlib.pyplot as plt
import seaborn as sns

## 데이터
age_category = ['10대 이하', '20대', '30대', '40대', '50대', '60대 이상'] ## 연령 카테고리, x축 눈금에 표시될 라벨
num_patient = [3,3,5,7,8,9] ## 방문환자수

## 시각화
plt.figure(figsize=(10,10)) ## Figure 생성 사이즈는 10 by 10
colors = sns.color_palette('hls',len(age_category)) ## 색상 지정
xtick_label_position = list(range(len(age_category))) ## x축 눈금 라벨이 표시될 x좌표
plt.xticks(xtick_label_position, age_category) ## x축 눈금 라벨 출력

plt.bar(xtick_label_position, num_patient, color=colors) ## 바 차트 출력

plt.title('지난달 연령별 방문환자 수',fontsize=20) ## 타이틀 출력
plt.xlabel('연령') ## x축 라벨 출력
plt.ylabel('방문환자수') ## y축 라벨 출력
plt.show()

이제 여러분은 막대기 색깔을 취향에 맞게 설정할 수 있을거예요~^0^

반응형

   2. 막대기 테두리 설정

꽁냥이는 바 차트 그릴 때 막대기 테두리를 항상 설정한답니당~ 없으면 뭔가 밋밋하거든용~

테두리는 bar메서드에서 edgecolor라는 인자에 색상을 넣어주시면 됩니당~

 

bar( . . . , edgecolor)

 

먼저 테두리를 검은색으로 지정했습니당. 위 코드에서 edgecolor 인자만 추가하였습니당~

edgecolor가 취할 수 있는 색상은 여기를 참고하세용~

plt.bar(xtick_label_position, num_patient, color=colors, edgecolor='black') ## 바 차트 출력

자, 그럼 실행해 볼까요? 

어때요? 테두리까지 들어가니까 더 예쁘지 않나용? >0<

막대기 색상과 마찬가지로 테두리 색깔도 막대기에 개별적으로 적용할 수 있는데요. 아래와 같이 edgecolor에 리스트를 넘겨주면 됩니당~

꽁냥이는 막대기 색상과 똑같은 걸로 테두리 색상을 지정했고요. 테두리를 강조하기 위해서 막대기 색상의 투명도(alpha 인자)와 테두리 두께(linewidth 인자)도 추가로 설정했습니당~

colors = sns.color_palette('hls',len(age_category)) ## 색상 지정
plt.bar(xtick_label_position, num_patient, color=colors, edgecolor=colors, alpha=0.7, linewidth=4) ## 바 차트 출력

전체 코드와 실행결과는 아래와 같아요~

import matplotlib.pyplot as plt
import seaborn as sns

## 데이터
age_category = ['10대 이하', '20대', '30대', '40대', '50대', '60대 이상'] ## 연령 카테고리, x축 눈금에 표시될 라벨
num_patient = [3,3,5,7,8,9] ## 방문환자수

## 시각화
plt.figure(figsize=(10,10)) ## Figure 생성 사이즈는 10 by 10
colors = sns.color_palette('hls',len(age_category)) ## 색상 지정
xtick_label_position = list(range(len(age_category))) ## x축 눈금 라벨이 표시될 x좌표
plt.xticks(xtick_label_position, age_category) ## x축 눈금 라벨 출력

plt.bar(xtick_label_position, num_patient, color=colors, \
        edgecolor=colors, alpha=0.7, linewidth=4) ## 바 차트 출력

plt.title('지난달 연령별 방문환자 수',fontsize=20) ## 타이틀 출력
plt.xlabel('연령') ## x축 라벨 출력
plt.ylabel('방문환자수') ## y축 라벨 출력
plt.show()

점점 바 차트가 발전하는 것 같아요~ 헤헤~

 


   3. 막대기에 텍스트 추가하기

드디어 마지막이네요~ 막대기 높이가 얼마인지 확인하기 위해 일일이 y축과 비교해보는 것은 사람에 따라서 또는 카테고리 개수에 따라서 힘든 일이 될 수 있지요~

 

이에 꽁냥이는 바 차트를 볼 사람들의 수고를 덜어주기 위하여 막대기 위에다가 막대기 높이(여기서는 방문 환자 수)를 텍스트로 출력해보려고 합니당~

 

기존에 그려진 바 차트 위에 텍스트를 추가하는 방식을 사용할 거예요(제가 matplotlib문서를 찾아봤는데 bar메서드에는 텍스트를 추가하는 기능을 따로 제공하지는 않는 것 같아요~)

 

이번 내용은 아래의 기사를 참고하였습니다.

 

Matplotlib 텍스트 추가 : https://www.science-emergence.com/Articles/How-to-add-text-on-a-bar-with-matplotlib-/

 

전체 코드는 아래와 같습니당~

바로 위의 코드와 많이 비슷해서 다 볼 필요는 없고 12~13, 21~26번째 줄 코드만 보시면 됩니당~

import matplotlib.pyplot as plt
import seaborn as sns

## 데이터
age_category = ['10대 이하', '20대', '30대', '40대', '50대', '60대 이상'] ## 연령 카테고리, x축 눈금에 표시될 라벨
num_patient = [3,3,5,7,8,9] ## 방문환자수

## 시각화
tick_size = 13 ## 눈금 폰트 사이즈
axis_label_size = 15 ## x축, y축 폰트 사이즈

fig = plt.figure(figsize=(10,10)) ## Figure 생성 사이즈는 10 by 10
ax = fig.add_subplot() ## Axes 추가
colors = sns.color_palette('hls',len(age_category)) ## 색상 지정

xtick_label_position = list(range(len(age_category))) ## x축 눈금 라벨이 표시될 x좌표

plt.yticks(fontsize=tick_size)
plt.xticks(xtick_label_position, age_category, fontsize=tick_size) ## x축 눈금 라벨 출력

bars = plt.bar(xtick_label_position, num_patient, color=colors, \
               edgecolor=colors, alpha=0.7, linewidth=3) ## 바차트 출력

for i, b in enumerate(bars):
    ax.text(b.get_x()+b.get_width()*(1/2),b.get_height()+0.1, \
            num_patient[i],ha='center',fontsize=13)
    
plt.title('지난달 연령별 방문환자 수',fontsize=20) ## 타이틀 출력
plt.xlabel('연령',fontsize=axis_label_size) ## x축 라벨 출력
plt.ylabel('방문환자수',fontsize=axis_label_size) ## y축 라벨 출력
plt.show()

먼저 바 차트 위에 텍스트를 추가하려면 Axes라는 객체를 만들어줘야 합니다. 

먼저 plt.figure를 fig라는 변수에 담아주고 add_subplot()을 호출하여 Axes 객체를 만들어줍니다(Matplotlib에서 Figure가 캔버스라면 Axes는 그림의 뼈대라고 생각하시면 됩니다)~

fig = plt.figure(figsize=(10,10)) ## Figure 생성 사이즈는 10 by 10
ax = fig.add_subplot() ## Axes 추가

우선 텍스트가 출력되는 위치를 지정해야 합니다. 이 위치에 대한 정보는 아래의 bars가 담고 있습니다.

bars = plt.bar(xtick_label_position, num_patient, color=colors, \
               edgecolor=colors, alpha=0.7, linewidth=3) ## 바차트 출력

자! 준비가 다됐네요~ 텍스트를 출력하기 위해서는 Axes에서 text메서드를 이용합니다. text의 기본형식은 다음과 같습니다.

 

text(x좌표, y좌표, 내용, . . . )

 

먼저 아래의 그림을 볼게용~

위 그림을 보면 텍스트의 x, y 좌표는 다음과 같다는 것을 금방 아실 거예요~

 

텍스트 x좌표 = 막대기(좌측 하단) x좌표 + 막대기 폭 * (1/2)

 

텍스트 y좌표 = 막대기 높이 + 간격

아래의 코드를 볼까용?

 

for i, b in enumerate(bars):
    ax.text(b.get_x()+b.get_width()*(1/2),b.get_height()+0.1, \
            num_patient[i],ha='center',fontsize=13)

코드 설명 들어갑니당~ 먼저 꽁냥이의 계획은 bars에 속한 원소를 하나씩 돌면서 텍스트를 생성하는 거예요.

그리고 각 원소의 메서드를 통해서 필요한 정보를 얻을 거 고용~

 

우리가 필요한 정보와 그 정보를 얻을 수 있는 메서드는 다음과 같아요.

정보 메서드
막대기(좌측 하단) x좌표 get_x
막대기 폭 get_width
막대기 높이 get_height

따라서 위 정보를 이용한다면 텍스트의 x, y좌표는 다음을 통해서 구할 수 있지요~

b.get_x()+b.get_width()*(1/2) #x 좌표
b.get_height()+0.1 #y 좌표

텍스트 y축 좌표에 추가적으로 0.1의 간격을 넣어준 이유는 텍스트와 막대기 윗부분이 딱 달라붙기 때문이랍니당~

추가적으로, x축 중심으로 정렬 기준(ha 인자)은 가운데 정렬, 폰트 사이즈(fontsize 인자)는 13으로 설정했습니당~

이제 결과를 볼까요? 위의 전체 코드를 실행하면 다음과 같은 결과를 보실 수 있어요~

와우~ 바 차트가 멋지게 변했어요~ 짝짝!!

이번 포스팅 내용은 여기까지고요. 이번 내용이 여러분에게 많은 도움이 되었으면 합니당~

 

궁금하신 내용이나 잘못된 내용, 그 밖에 하고 싶은 말은 댓글로 남겨주시면 감사하겠습니다.

 

다음 포스팅에서는 막대기에 그라데이션을 입히는 방법을 소개하겠습니다.

지금까지 '꽁냥이의 글' 읽어 주셔서 감사합니다. 안녕히 계세요~~>0< 

 


1. Matplotlib을 이용하여 바 차트, 수평 바 차트 그리기

2. Matplotlib을 이용하여 바 차트 꾸미기

3. Matplotlib 바 차트 번외 - 막대에 그라데이션 적용하기

4. Matplotlib을 이용하여 그룹 바 차트(Grouped bar chart) 그리기

5. Matplotlib을 이용하여 스택 바 차트(Stacked bar chart) 그리기



댓글


맨 위로