데이터 분석이나 시각화 작업을 하다 보면 (x, y, z) 좌표가 담긴 튜플 리스트를 3D 표면 그래프로 변환해야 하는 경우가 자주 있습니다. 이 글에서는 Python의 matplotlib 라이브러리를 사용해 튜플 리스트로부터 3D 표면(surface) 플롯을 그리는 방법을 단계별로 살펴보겠습니다.
구현 단계
그림(figure) 크기를 설정하고 서브플롯 주변의 여백(padding)을 조정합니다.
x, y, z 좌표를 포함하는 튜플 리스트를 준비합니다.
zip(*data)를 활용해 튜플 리스트에서 x, y, z 데이터 포인트를 각각 추출합니다.np.meshgrid()함수로 좌표 벡터로부터 좌표 행렬을 생성합니다.표면의 높이 값에 해당하는 h 데이터를 계산합니다.
새로운 figure를 생성하거나 기존 figure를 활성화합니다.
figure에서 3D 투영(projection)이 적용된 축(axis)을 가져옵니다.
plot_surface()메서드로 표면 플롯을 생성합니다.plt.show()메서드로 결과 그래프를 화면에 출력합니다.
예제 코드
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
# x, y, z 좌표가 담긴 튜플 리스트
data = [(1, 3, 2), (3, 5, 2), (4, 7, 4), (8, 7, 4),
(3, 6, 1), (3, 9, 0), (3, 9, 0)]
# 튜플 리스트에서 데이터 포인트 추출
x, y, z = zip(*data)
# 좌표 벡터로부터 좌표 행렬 생성
x, y = np.meshgrid(x, y)
# 표면의 높이(h) 데이터 계산
h = x ** 2 + y ** 2
fig = plt.figure()
# 3D 투영 축 가져오기
ax = fig.gca(projection='3d')
# 표면 플롯 생성
ax.plot_surface(x, y, h, cmap='plasma')
plt.show()
참고 사항
위 코드의 fig.gca(projection='3d')는 구버전 방식이며, 최신 matplotlib 버전(3.x 이상)에서는 다음과 같이 add_subplot()을 사용하는 것이 권장됩니다.
ax = fig.add_subplot(projection='3d')
또한 cmap='plasma' 옵션은 표면의 높이에 따라 색상을 지정하는 컬러맵 설정입니다. 필요에 따라 'viridis', 'coolwarm' 등 다른 컬러맵으로 변경할 수 있습니다.
실행 결과
위 코드를 실행하면 튜플 리스트의 데이터를 기반으로 한 3D 표면 그래프가 출력됩니다.
