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

Matplotlib에서 모든 xticks를 표시하며 Pandas 다중 인덱스 DataFrame 플롯하는 방법

Pandas의 다중 인덱스(MultiIndex) DataFrame을 Matplotlib으로 시각화할 때, 기본 설정에서는 x축 눈금(xticks)이 일부 생략되어 표시될 수 있습니다. 이럴 때 set_xticks()set_xticklabels() 메서드를 활용하면 모든 눈금과 레이블을 명확하게 표시할 수 있습니다. 아래에서 단계별로 살펴보겠습니다.

구현 단계

  • 그림(figure) 크기를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.
  • 1000개의 샘플 데이터를 가진 날짜 범위(date_range) 인덱스를 생성합니다.
  • 날짜를 축 레이블로 갖는 1차원 배열 형태의 Pandas Series를 만듭니다.
  • 연도(year)와 월(month)을 기준으로 데이터를 그룹화하여 각 그룹의 평균값을 계산합니다.
  • 계산된 DataFrame(g)을 플롯합니다.
  • 현재 축(ax)에 눈금 위치와 눈금 레이블을 직접 설정합니다.
  • show() 메서드를 호출하여 그림을 화면에 표시합니다.

예제 코드

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

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

idx = pd.date_range("2020-01-01", periods=1000)
val = np.random.rand(1000)
s = pd.Series(val, idx)

g = s.groupby([s.index.year, s.index.month]).mean()

ax = g.plot()
ax.set_xticks(range(len(g)))
ax.set_xticklabels(["%s-%02d" % item for item in g.index.tolist()],
rotation=45, ha='center')

plt.show()

핵심 코드 설명

s.groupby([s.index.year, s.index.month]).mean()은 일별 데이터를 연도와 월 단위로 묶어 월별 평균값을 계산합니다. 이렇게 하면 인덱스가 (연도, 월) 형태의 다중 인덱스로 구성된 Series가 반환됩니다.

ax.set_xticks(range(len(g)))는 x축 눈금 위치를 데이터 개수만큼 지정하여, Matplotlib이 임의로 눈금을 건너뛰지 않고 모든 항목이 눈금으로 표시되도록 합니다.

ax.set_xticklabels()는 다중 인덱스의 (연도, 월) 튜플을 "2020-01", "2020-02"와 같은 문자열로 변환해 레이블로 지정합니다. rotation=45 옵션으로 레이블을 45도 회전시키면 레이블이 길어져도 서로 겹치지 않고 깔끔하게 배치됩니다.

실행 결과

위 코드를 실행하면 2020년 1월부터 약 2년 9개월간의 월별 평균값을 보여주는 선 그래프가 생성됩니다. x축에는 연도-월 형식의 레이블이 45도 회전되어 중앙 정렬로 모두 표시되므로, 어떤 달의 데이터인지 한눈에 파악할 수 있습니다.