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

[범례(Legend)] 1. Matplotlib를 이용한 범례 꾸미기 - 기본

by 부자 꽁냥이 2020. 7. 4.

안녕하세요~ 꽁냥이에요.

 

이번 포스팅에서는 Matplotlib에서 범례를 표시하는 방법에 대해서 알아볼 거예요.

 

범례는 그래프가 어떤 정보를 담고 있는지 알려주는 친구예요. 아래 그림은 그래프에서 범례가 있어야 하는 이유를 알려주고 있습니다.

 

 

이번 포스팅에서는 자주 사용하는 바 차트와 선 그래프의 범례를 그리는 기본적인 방법을 소개합니다.

 

1. 범례를 그리는 기본적인 방법 - 바 차트

2. 범례를 그리는 기본적인 방법 - 선 그래프

 

LIST

   1. 범례를 그리는 기본적인 방법 - 바 차트

먼저 바 차트에서 범례를 표시하는 방법을 알아볼게요. 그 전에 이번 포스팅에서 사용할 데이터를 만들거예요. 아래의 코드를 실행해주세요.

import pandas as pd

df = pd.DataFrame()
df['days'] = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun']*2 ## 요일
df['visits'] = [32,23,14,14,27,40,35,37,28,9,41,29,30,51] ## 방문 고객수
df['gender'] = ['male']*7 + ['female']*7 ## 성별

 

Matplotlib에서 범례를 표시할 때는 legend 메서드를 사용해요. 다음은 legend메서드의 기본적인 방법을 나타낸 거예요.


legend(그래프 요소를 담은 리스트, 범례에 표시할 라벨)


다음은 바 차트에서 범례를 그리는 코드에요. 

## 범례 -바 차트 기본
import matplotlib.pyplot as plt
import seaborn as sns

## 성별 데이터 분리하기
## 데이터를 요일 순으로 정렬
days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
total_df = df.groupby('days')['visits'].sum().reindex(days).reset_index()
## 바 차트 그리기
colors = sns.color_palette('hls',len(df)) ## 막대기 개수만큼 색상 지정

fig = plt.figure(figsize=(8,8)) ## 캔버스 생성
fig.set_facecolor('white') ## 캔버스 색상 설정
ax = fig.add_subplot() ## 프레임(그림 뼈대) 생성

## 바 차트 생성
bars = ax.bar(total_df['days'],total_df['visits'],color=colors) ## 막대기 요소 저장

ax.legend(handles=bars,labels=list(total_df['days'])) ## 범례

plt.show()
반응형

여기서는 범례와 관련된 부분만 설명할게요. 설명하지 않는 부분은 주석을 참고하세요.

 

line 17

먼저 바 차트를 그려줍니다. 그리고 그래프의 요소인 막대기를 bars 변수에 담아요. 요일이 총 7개이므로 bars에는 7개의 막대기 요소가 담겨 있어요. 바 차트에 관한 내용은 여기를 참고하세요.

 

line 19

다음으로 막대기 요소를 담은 bars를 legend 메서드의 handles인자에, 그리고 표시할 텍스트는 labels 인자에 담아줍니다.

 

자 코드를 실행해 볼까요?

 

실행 결과

와우~ 초록색 동그라미에 표시된 것처럼 범례가 잘 나온 것을 확인할 수 있습니다.


   2. 범례를 그리는 기본적인 방법 - 선 그래프

이번에는 선 그래프에 범례를 그려볼거예요. 선 그래프는 바 차트와 달리 좀 더 쉽게 범례를 그릴 수 있어요. 아래 코드를 통해 살펴볼게요.

## 범례 -선 그래프 기본
import matplotlib.pyplot as plt

## 성별 데이터 분리하기
male_df = df.query('gender =="male"') ## 남자 데이터
male_visits = male_df['visits'] ## 남자 방문자수
days = male_df['days'] ## 요일

female_df = df.query('gender == "female"') ## 여자 데이터
female_visits = female_df['visits'] ## 여자 방문자수

## 선그래프 그리기
fig = plt.figure(figsize=(8,8)) ## 캔버스 생성
fig.set_facecolor('white') ## 캔버스 색상 설정
ax = fig.add_subplot() ## 프레임(그림 뼈대) 생성

## 선 그래프 생성
ax.plot(days, male_visits, marker='o', label='male') 
ax.plot(days, female_visits, marker='o', label='female')

ax.legend() ## 범례

plt.show()

 

line 18~19

남자, 여자 방문자수를 그리기 위해서 선 그래프를 두개 생성했어요. 여기서 범례에 표시될 텍스트를 label인자에 넣어줘야 해요. 선 그래프에 관한 내용은 여기를 참고하세요

 

line 21

그리고 바 차트와 다르게 여기서는 legend 메서드에 따로 인자를 넣지 않고 호출합니다.

 

코드를 실행해볼까요?

 

초록색 동그라미로 표시한 부분을 보면 범례가 잘 그려진 것을 확인할 수 있어요.

 

 


분명 legend 메서드는 그래프 요소와 라벨을 기본적으로 인자에 넣어줘야 된다고 했는데,

여기서는 아무것도 넣지 않았지요.

그런데도 왜 범례가 표시될까요?


이를 이해하려면 legend 메서드의 동작 방식을 알아야 해요.

 

먼저 선 그래프를 그리는 코드에서 ax.plot 메서드를 두 번 호출하여 선 요소 2개를 만들었고요. 선 요소에 해당하는 라벨을 ax.plot 메서드에서 label 인자에 넣어줬음을 주목하세요.

 

legend메서드는 인자에 아무것도 넣지 않을 경우 이렇게 만들어둔 선 요소 2개와 라벨 2개를 자동적으로 handles인자와 labels인자에 넣어주지요. 이러한 사실은 ax.get_legend_handles_labels메서드를 통해서 확인할 수 있어요. 이 메서드는 현재 legend메서드가 가지고 있는 선 그래프 요소(handles)와 범례 라벨(labels)을 출력해주지요.

 

위 그림을 보시면 legend메서드에 따로 인자를 넣지 않아도 알아서 handles에 2개의 선 요소(matplotlib.lines.Line2D 클래스), labels에 2개의 라벨(male, female)을 넣어준 것을 확인할 수 있습니다.


이번 포스팅에서는 Matplotlib을 이용한 범례 그리기에 관한 기본 내용을 살펴봤는데요. 보시다가 궁금한 점, 잘못된 점, 그 밖에 하고 싶은 말은 댓글로 남겨주세요~

 

아 그리고 도움이 되셨다면, 아래 ♥버튼 눌러주시면 감사해요~ >0<

 

다음 포스팅에서는 범례 안에 라벨을 꾸미는 방법에 대해서 소개하겠습니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다.

 


댓글


맨 위로