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

Python Matplotlib로 x, y, z 산점 데이터에서 3D 표면 그리는 방법

Python에서 x, y, z 산점(scatter) 데이터를 이용해 3D 표면(surface) 그래프를 그리려면 다음 단계를 따르면 됩니다.

  • 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변의 여백(padding)을 조정합니다.
  • figure() 메서드를 사용하여 새 그림을 생성하거나 기존 그림을 활성화합니다.
  • 서브플롯(subplot) 배치의 일부로 그림에 3D 축(axes)을 추가합니다.
  • numpy를 사용하여 x, y, X, Y, Z 데이터 포인트를 생성합니다.
  • plot_surface() 메서드를 사용하여 x, y, z 데이터 포인트를 3D 표면으로 플롯합니다.
  • show() 메서드를 사용하여 그림을 화면에 표시합니다.

핵심 개념 정리

이 예제에서 가장 중요한 부분은 np.meshgrid()입니다. 산점 형태의 1차원 x, y 좌표 배열을 받아 2차원 격자(grid) 좌표 X, Y로 변환해 줍니다. 3D 표면을 그리려면 각 격자 지점마다 대응하는 Z 값이 필요하기 때문입니다. 여기서는 Z = X * exp(-X² - Y²) 수식을 사용하여 가우시안 형태의 표면을 만들었습니다.

예제 코드

import matplotlib.pyplot as plt
import numpy as np

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

fig = plt.figure()

ax = fig.add_subplot(111, projection='3d')
x = np.array(np.linspace(-2, 2, 100))
y = np.array(np.linspace(-2, 2, 10))

X, Y = np.meshgrid(x, y)
Z = X * np.exp(-X ** 2 - Y ** 2)

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap="plasma", linewidth=0, antialiased=False)

plt.show()

코드 설명

  • rstride, cstride: 행(row)과 열(column) 방향의 샘플링 간격을 지정합니다. 값을 1로 설정하면 모든 데이터 포인트가 표면에 반영됩니다.
  • cmap="plasma": 표면 높이(Z값)에 따라 색상을 매핑하는 컬러맵을 지정합니다. "viridis", "coolwarm" 등 다른 컬러맵으로 교체할 수 있습니다.
  • linewidth=0, antialiased=False: 표면의 선을 제거하고 계단 현상(aliasing)을 비활성화하여 더 깔끔한 렌더링 결과를 얻습니다.

실행 결과

위 코드를 실행하면 가우시안 분포 형태의 3D 표면이 plasma 컬러맵으로 표현되어 출력됩니다. 높이가 높은 영역은 밝은 색으로, 낮은 영역은 어두운 색으로 표시되어 데이터의 분포를 직관적으로 파악할 수 있습니다.