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

Matplotlib로 범례와 보조 Y축을 활용해 두 개의 Pandas 시계열을 한 플롯에 그리는 방법

데이터 분석에서 서로 다른 스케일을 가진 두 개의 시계열 데이터를 하나의 그래프에 비교해야 할 때가 자주 있습니다. 이때 Matplotlib의 보조 Y축(secondary y-axis) 기능을 활용하면 각각의 데이터를 적절한 축에 표시하고, 범례(legend)까지 한 번에 관리할 수 있습니다.

구현 절차

범례와 보조 Y축이 있는 동일한 플롯에 두 개의 Pandas 시계열을 그리려면 다음 단계를 따르면 됩니다.

  • plt.rcParams를 사용해 그림 크기를 설정하고, 서브플롯 주변 및 사이의 여백을 자동으로 조정합니다.

  • pd.date_range()로 날짜 인덱스를 생성하고, 난수 데이터를 담은 1차원 ndarray로 시계열 Series를 만듭니다.

  • A, B, C, D 네 개의 열을 가지는 DataFrame을 생성합니다.

  • DataFrame의 plot() 메서드를 사용해 A열은 왼쪽 Y축에, B열secondary_y=True 옵션으로 오른쪽 보조 Y축에 각각 플롯합니다.

  • get_legend_handles_labels() 메서드로 각 축의 범례 핸들(handle)과 레이블(label)을 가져옵니다.

  • 두 축의 핸들과 레이블을 합쳐 legend() 메서드로 하나의 범례에 통합 배치합니다.

  • show() 메서드로 최종 그래프를 화면에 출력합니다.

예제 코드

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np

# 그림 크기 및 여백 자동 조정 설정
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

# 날짜 인덱스를 가진 시계열 생성
ts = pd.Series(np.random.randn(10), index=pd.date_range('2021-04-10', periods=10))

# 시계열 인덱스를 공유하는 DataFrame 생성
df = pd.DataFrame(np.random.randn(10, 4), index=ts.index, columns=list('ABCD'))

# A열은 왼쪽 Y축, B열은 오른쪽 보조 Y축에 플롯
ax1 = df.A.plot(color='red', label='Count')
ax2 = df.B.plot(color='yellow', secondary_y=True, label='Sum')

# 각 축의 범례 핸들과 레이블 수집
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()

# 두 범례를 하나로 병합하여 좌측 상단에 표시
plt.legend(h1+h2, l1+l2, loc=2)

plt.show()

핵심 포인트 정리

  • secondary_y=True: 해당 열을 오른쪽 Y축에 별도의 스케일로 그립니다.

  • get_legend_handles_labels(): 각 Axes 객체에 등록된 선과 라벨 정보를 반환합니다.

  • legend(h1+h2, l1+l2, loc=2): 두 축의 요소를 하나의 범례로 합치며, loc=2는 좌측 상단 위치를 의미합니다.

이 방식을 사용하면 단위나 크기가 다른 두 시계열을 직관적으로 비교할 수 있으며, 범례도 중복 없이 깔끔하게 표현할 수 있습니다.