안녕하세요~ 꽁냥이에요.
이번 포스팅에서는 Matplotlib에서 범례를 표시하는 방법에 대해서 알아볼 거예요.
범례는 그래프가 어떤 정보를 담고 있는지 알려주는 친구예요. 아래 그림은 그래프에서 범례가 있어야 하는 이유를 알려주고 있습니다.
이번 포스팅에서는 자주 사용하는 바 차트와 선 그래프의 범례를 그리는 기본적인 방법을 소개합니다.
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<
다음 포스팅에서는 범례 안에 라벨을 꾸미는 방법에 대해서 소개하겠습니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다.
'데이터 분석 > 시각화' 카테고리의 다른 글
[범례(Legend)] 2. Matplotlib를 이용한 범례 그리기 - 텍스트 꾸미기 (408) | 2020.07.06 |
---|---|
[선 그래프(Line graph)] 2. Matplotlib을 이용하여 선 그래프 꾸미기 (400) | 2020.07.05 |
[선 그래프(Line graph)] 1. Matplotlib을 이용하여 선 그래프 그리기 (398) | 2020.07.02 |
[기타] Matplotlib 선 종류(Line style) 지정 (393) | 2020.06.28 |
[바 차트(Bar chart)] 5. Matplotlib을 이용하여 스택 바 차트(Stacked bar chart) 그리기 (826) | 2020.06.25 |
댓글