안녕하세요~ '꽁냥이'입니다.
[바 차트(Bar chart)] 1. Matplotlib을 이용하여 바 차트, 수평 바 차트 그리기에 이어서 이번 포스팅에서는 Matplotlib을 이용하여 바 차트를 좀 더 예쁘게 꾸며보는 방법에 대해 소개하고요~
이번 포스팅 내용은 다음과 같습니당~
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
color_palette 사용 예제 : https://seaborn.pydata.org/generated/seaborn.color_palette.html#seaborn.color_palette
전체 코드와 실행 결과는 다음과 같아요~
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을 이용하여 바 차트, 수평 바 차트 그리기
3. Matplotlib 바 차트 번외 - 막대에 그라데이션 적용하기
4. Matplotlib을 이용하여 그룹 바 차트(Grouped bar chart) 그리기
5. Matplotlib을 이용하여 스택 바 차트(Stacked bar chart) 그리기
'데이터 분석 > 시각화' 카테고리의 다른 글
[바 차트(Bar chart)] 4. Matplotlib을 이용하여 그룹 바 차트(Grouped bar chart) 그리기 (1690) | 2020.06.22 |
---|---|
[바 차트(Bar chart)] 3. Matplotlib 바 차트 번외 - 막대에 그라데이션 적용하기 (1100) | 2020.06.14 |
[바 차트(Bar chart)] 1. Matplotlib을 이용하여 바 차트, 수평 바 차트 그리기 (2) | 2020.06.06 |
[기타] Matplotlib 한글 폰트 설정 - Window 10 (2) | 2020.05.31 |
[프롤로그] 들어가는 글 (0) | 2020.05.31 |
댓글