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

Matplotlib에서 마스크(Masked) 및 NaN 값 시각화하는 방법

데이터 분석 과정에서 결측치나 특정 조건을 제외해야 하는 값들이 자주 발생합니다. Matplotlib에서는 이러한 값을 포인트 제거, 마스킹(masking), NaN 대체라는 세 가지 방식으로 처리할 수 있으며, 각 방식에 따라 그래프가 표현되는 모습이 다릅니다.

처리 순서

  • figure.figsize로 그림 크기를 설정하고, figure.autolayout으로 서브플롯 주변 여백을 자동 조정합니다.
  • numpy의 linspace()cos() 함수를 사용해 x, y 데이터 포인트를 생성합니다.
  • y ≤ 0.7 조건을 만족하는 포인트만 남겨 x2, y2 데이터를 만듭니다. (조건 불일치 포인트 제거)
  • np.ma.masked_where()를 사용해 y > 0.7인 구간을 마스킹한 y3를 생성합니다.
  • y > 0.7인 값을 np.nan으로 대체한 y4를 생성합니다.
  • plot() 메서드로 네 개의 데이터를 서로 다른 x축 배율과 함께 플롯합니다.
  • legend()로 범례를 추가하고, title()로 그래프 제목을 설정합니다.
  • show() 메서드로 최종 그래프를 화면에 표시합니다.

예제 코드

import matplotlib.pyplot as plt
import numpy as np

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

x = np.linspace(-np.pi/2, np.pi/2, 31)
y = np.cos(x)**3

# 1) y > 0.7인 포인트 제거
x2 = x[y <= 0.7]
y2 = y[y <= 0.7]

# 2) y > 0.7인 포인트 마스킹
y3 = np.ma.masked_where(y > 0.7, y)

# 3) y > 0.7인 값을 NaN으로 설정
y4 = y.copy()
y4[y3 > 0.7] = np.nan

plt.plot(x*0.1, y, 'o-', color='lightgrey', label='No mask')
plt.plot(x*0.4, y2, 'o-', label='Points removed')
plt.plot(x*0.7, y3, 'o-', label='Masked values')
plt.plot(x*1.0, y4, 'o-', label='NaN values')
plt.legend()

plt.title('Masked and NaN data')

plt.show()

실행 결과

코드를 실행하면 네 가지 방식이 한 화면에 나란히 표시됩니다.

  • No mask: 전체 데이터가 연결된 선으로 그려집니다.
  • Points removed: 조건에 맞지 않는 구간이 아예 생략되어 선이 끊긴 채 표시됩니다.
  • Masked values: 마스킹된 구간은 선이 그려지지 않지만 데이터 자체는 유지됩니다.
  • NaN values: NaN이 있는 위치에서 선이 자연스럽게 끊기며, 실무에서 가장 널리 쓰이는 방식입니다.

세 방법 모두 결과적으로 해당 구간을 표시하지 않는다는 점은 같지만, 원본 배열을 유지하면서 시각화만 제어하는 마스킹과 데이터를 직접 변경하는 NaN 대체 중 어떤 것을 선택할지는 데이터 파이프라인의 요구 사항에 따라 결정하면 됩니다.