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

Matplotlib로 3D 표면 그래프에 등고선 플롯 투영하기

개요

Matplotlib에서 3D 표면 그래프(plot_surface)에 등고선 플롯을 투영하려면 plot_surface() 메서드와 contourf() 메서드를 함께 활용하면 됩니다. 표면 그래프 아래쪽이나 옆면에 채워진 등고선(contourf)을 배치하면 데이터의 입체적인 구조를 한눈에 파악할 수 있어 시각화 효과가 크게 향상됩니다.

구현 단계

  • 그림 크기를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.

  • Numpy를 사용하여 x, y, X, Y, Z 데이터 포인트를 생성합니다.

  • figure() 메서드를 사용해 새 figure를 생성하거나 기존 figure를 활성화합니다.

  • 3D 투영(projection='3d')이 적용된 Axes를 서브플롯으로 figure에 추가합니다.

  • plot_surface() 메서드로 3D 표면 그래프를 그립니다.

  • contourf() 메서드를 사용해 z축, x축, y축 방향으로 채워진 등고선 플롯을 각각 생성합니다.

  • 축(axis)을 끄고 깔끔한 화면을 만듭니다.

  • show() 메서드로 그림을 화면에 출력합니다.

예제 코드

import numpy as np
from matplotlib import pyplot as plt

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

x = np.arange(-5, 5, 0.1)
y = np.arange(-5, 5, 0.1)
X, Y = np.meshgrid(x, y)
Z = X * np.exp(-X - Y)

fig = plt.figure()

ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=1, cmap="copper")
ax.contourf(X, Y, Z, zdir='z', offset=np.min(Z), cmap="plasma")
ax.contourf(X, Y, Z, zdir='x', offset=-5, cmap="PiYG_r")
ax.contourf(X, Y, Z, zdir='y', offset=5, cmap="PuBuGn")

ax.axis('off')
plt.show()

코드 설명

np.meshgrid(x, y)는 x, y 좌표 배열로부터 격자(grid) 형태의 2D 좌표 행렬 X, Y를 생성하며, 이를 바탕으로 함수식 Z = X * np.exp(-X - Y)로 높이 값 Z를 계산합니다.

plot_surface()에서 rstridecstride 인자는 행과 열 방향의 샘플링 간격을 조절해 그래프의 밀도를 낮추고, cmap="copper"로 표면에 구리색 컬러맵을 적용합니다.

contourf()의 핵심은 zdiroffset 인자입니다. zdir은 등고선이 투영될 축 방향('z', 'x', 'y')을 지정하고, offset은 해당 축에서 등고선이 놓일 위치를 결정합니다. 위 예제에서는 세 방향 모두에 서로 다른 컬러맵(plasma, PiYG_r, PuBuGn)을 적용해 입체감과 가독성을 동시에 살렸습니다.

실행 결과

Matplotlib로 3D 표면 그래프에 등고선 플롯 투영하기