Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python Matplotlib 차트에 범례(Legend) 추가하는 방법 완벽 가이드

들어가며

차트의 가장 큰 목적은 데이터를 한눈에 쉽게 이해하도록 돕는 것입니다. "백 마디 말보다 한 장의 그림이 낫다"는 말처럼, 언어로 표현하기 어려운 복잡한 내용도 하나의 이미지나 차트만으로 효과적으로 전달할 수 있습니다.

특히 많은 정보를 담은 그래프를 그릴 때는 범례(legend)를 활용하면 좋습니다. 범례는 각 데이터 계열이 무엇을 의미하는지 알려주어 그래프의 가독성과 이해도를 크게 높여줍니다.

준비하기

matplotlib에서는 범례를 다양한 방식으로 표현할 수 있으며, 특정 지점을 강조하는 주석(annotation)을 함께 사용하면 독자가 그래프에 담긴 정보를 더 잘 이해하도록 도울 수 있습니다.

1단계: Python 명령 프롬프트를 열고 다음 명령어로 matplotlib을 설치합니다.
pip install matplotlib

2단계: 화면에 표시할 데이터를 준비합니다. 아래 예제에서는 아이폰, 갤럭시, 픽셀 세 종류의 스마트폰에 대해 연도별 판매 대수(단위: 백만 대) 데이터를 임의로 작성했습니다.

데이터 준비 예제

import matplotlib.pyplot as plt

# 데이터 준비 (통계 정확도는 없는 임의의 데이터입니다)
mobile = ['Iphone','Galaxy','Pixel']

# 연도별 스마트폰 판매 대수 (단위: 백만 대)
units_sold = (('2016',12,8,6),
('2017',14,10,7),
('2018',16,12,8),
('2019',18,14,10),
('2020',20,16,5),)

3단계: 제조사별 판매량 데이터를 각각의 배열로 분리하고, X축 라벨로 사용할 연도 목록과 막대의 위치·너비를 설정합니다.

데이터 분리 예제

# 데이터 분리
IPhone_Sales = [Iphones for Year, Iphones, Galaxy, Pixel in units_sold]
Galaxy_Sales = [Galaxy for Year, Iphones, Galaxy, Pixel in units_sold]
Pixel_Sales = [Pixel for Year, Iphones, Galaxy, Pixel in units_sold]

# X축 라벨
Years = [Year for Year, Iphones, Galaxy, Pixel in units_sold]

# 막대 위치 설정
Position = list(range(len(units_sold)))

# 막대 너비 설정
Width = 0.2

막대 그래프 그리기

4단계: 준비한 데이터로 막대 그래프를 생성합니다. 각 제품의 판매량마다 plt.bar()를 호출하며, 막대의 위치와 판매량을 지정합니다.

주석은 xy와 xytext 속성을 사용해 추가합니다. 데이터를 살펴보면 Google Pixel의 판매량이 2019년 1,000만 대에서 2020년 500만 대로 50% 급감했습니다. 따라서 마지막 막대에 해당 텍스트와 주석을 표시하겠습니다.

마지막으로 legend() 함수를 호출해 범례를 추가합니다. 기본적으로 matplotlib은 데이터와 겹치는 부분이 가장 적은 영역에 범례를 자동으로 배치합니다.

그래프 작성 예제

plt.bar([p - Width for p in Position], IPhone_Sales, width=Width,color='green')
plt.bar([p for p in Position], Galaxy_Sales , width=Width,color='blue')
plt.bar([p + Width for p in Position], Pixel_Sales, width=Width,color='yellow')

# X축을 연도로 설정
plt.xticks(Position, Years)

# 축 라벨 설정
plt.xlabel('Yearly Sales')
plt.ylabel('Unit Sales In Millions')

# 주석 추가: xy와 xytext로 화살표 위치 조절
plt.annotate('50% Drop in Sales', xy=(4.2, 5), xytext=(5.0, 12),
horizontalalignment='center',
arrowprops=dict(facecolor='red', shrink=0.05))

# 범례 설정
plt.legend(mobile, title='Manufacturers')

실행 결과

<matplotlib.legend.Legend at 0x19826618400>

Python Matplotlib 차트에 범례(Legend) 추가하는 방법 완벽 가이드

  • 차트 안에 범례를 넣으면 화면이 복잡해 보인다면, bbox_to_anchor 옵션을 사용해 범례를 차트 바깥쪽에 배치할 수 있습니다. bbox_to_anchor는 (X, Y) 좌표를 받으며, 0은 그래프의 왼쪽 아래 모서리, 1은 오른쪽 위 모서리를 의미합니다.

참고: subplots_adjust()를 사용하면 그래프가 시작하고 끝나는 위치를 조정해 범례가 잘리지 않도록 만들 수 있습니다.

예를 들어 right=0.50으로 설정하면 플롯 오른쪽에 화면 공간의 50%를 남기라는 의미입니다. left의 기본값은 0.125로, 왼쪽에 12.5%의 여백을 두는 것을 뜻합니다.

범례를 차트 밖으로 배치하기

plt.legend(mobile, title='Manufacturers', bbox_to_anchor=(1, 0.8))
plt.subplots_adjust(right=1.2)

Python Matplotlib 차트에 범례(Legend) 추가하는 방법 완벽 가이드

전체 코드 및 그래프 저장

6단계: 마지막으로 완성된 그래프를 이미지 파일로 저장합니다.

import matplotlib.pyplot as plt

# 데이터 준비 (통계 정확도는 없는 임의의 데이터입니다)
mobile = ['Iphone','Galaxy','Pixel']

# 연도별 스마트폰 판매 대수 (단위: 백만 대)
units_sold = (('2016',12,8,6),
('2017',14,10,7),
('2018',16,12,8),
('2019',18,14,10),
('2020',20,16,5),)

# 데이터 분리
IPhone_Sales = [Iphones for Year, Iphones, Galaxy, Pixel in units_sold]
Galaxy_Sales = [Galaxy for Year, Iphones, Galaxy, Pixel in units_sold]
Pixel_Sales = [Pixel for Year, Iphones, Galaxy, Pixel in units_sold]

# X축 라벨
Years = [Year for Year, Iphones, Galaxy, Pixel in units_sold]

# 막대 위치 설정
Position = list(range(len(units_sold)))

# 막대 너비 설정
Width = 0.2

plt.bar([p - Width for p in Position], IPhone_Sales, width=Width,color='green')
plt.bar([p for p in Position], Galaxy_Sales , width=Width,color='blue')
plt.bar([p + Width for p in Position], Pixel_Sales, width=Width,color='yellow')

# X축을 연도로 설정
plt.xticks(Position, Years)

# 축 라벨 설정
plt.xlabel('Yearly Sales')
plt.ylabel('Unit Sales In Millions')

# 주석 추가: xy와 xytext로 화살표 위치 조절
plt.annotate('50% Drop in Sales', xy=(4.2, 5), xytext=(5.0, 12),
horizontalalignment='center',
arrowprops=dict(facecolor='red', shrink=0.05))

# 범례 설정
plt.legend(mobile, title='Manufacturers')

# 범례를 차트 밖으로 배치
plt.subplots_adjust(right=1.2)

# 그래프를 파일로 저장
plt.savefig('MobileSales.png')

Python Matplotlib 차트에 범례(Legend) 추가하는 방법 완벽 가이드