데이터 시각화에서 특정 조건을 만족하는 영역을 제외하고 그래프를 그리고 싶을 때가 있습니다. 이럴 때 마스크(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()가 마스크된 데이터를 기반으로 붉은색 표면을 렌더링합니다.
실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.


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