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

Python, NumPy, Matplotlib로 마스크(Mask) 처리된 3D 표면 플롯 그리기

데이터 시각화에서 특정 조건을 만족하는 영역을 제외하고 그래프를 그리고 싶을 때가 있습니다. 이럴 때 마스크(mask) 기능을 활용하면 원하지 않는 데이터 포인트를 손쉽게 숨길 수 있습니다. 이번 글에서는 Python의 NumPy와 Matplotlib를 사용하여 마스크가 적용된 3D 표면 플롯(surface plot)을 그리는 방법을 단계별로 알아보겠습니다.

구현 단계

  • 그림(figure) 크기를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.
  • 새로운 그림을 생성하거나 기존 그림을 활성화합니다.
  • 서브플롯 배치의 일부로 그림에 축(ax)을 추가합니다.
  • 좌표 벡터인 pi와 theta로부터 좌표 행렬(meshgrid)을 반환받습니다.
  • 마스크가 적용된 데이터 포인트로 x, y, z 값을 생성합니다.
  • x, y, z 데이터 포인트를 사용해 표면 플롯을 그립니다.
  • 그림을 화면에 표시하려면 show() 메서드를 사용합니다.

예제 코드

import matplotlib.pyplot as plt
import numpy as np

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

fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
pi, theta = np.meshgrid(
   np.arange(1, 10, 2) * np.pi / 4,
   np.arange(1, 10, 2) * np.pi / 4)

x = np.cos(pi) * np.sin(theta)
y = np.sin(pi) * np.sin(theta)
z = np.ma.masked_where(x >= 0.01, y)

ax.plot_surface(x, y, z, color='red')

plt.show()

코드 설명

이 코드의 핵심은 np.ma.masked_where() 함수입니다. 이 함수는 첫 번째 인자로 주어진 조건(x >= 0.01)이 참인 위치의 데이터를 마스킹하여, 해당 영역이 표면 플롯에 나타나지 않도록 합니다. 즉, x 값이 0.01 이상인 지점의 y 데이터는 자동으로 제외되어 그래프에 빈 공간으로 표시됩니다.

np.meshgrid()는 구면 좌표 계산에 필요한 pi와 theta의 격자 좌표를 만들어주며, 삼각함수를 통해 구 형태의 3차원 표면 데이터를 생성합니다. 마지막으로 ax.plot_surface()가 마스크된 데이터를 기반으로 붉은색 표면을 렌더링합니다.

실행 결과

위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

Python, NumPy, Matplotlib로 마스크(Mask) 처리된 3D 표면 플롯 그리기Python, NumPy, Matplotlib로 마스크(Mask) 처리된 3D 표면 플롯 그리기

이처럼 NumPy의 마스크 배열(masked array) 기능과 Matplotlib의 3D 플롯을 결합하면, 조건에 따라 특정 영역을 제외한 맞춤형 시각화를 간단하게 구현할 수 있습니다.