개요
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()에서 rstride와 cstride 인자는 행과 열 방향의 샘플링 간격을 조절해 그래프의 밀도를 낮추고, cmap="copper"로 표면에 구리색 컬러맵을 적용합니다.
contourf()의 핵심은 zdir과 offset 인자입니다. zdir은 등고선이 투영될 축 방향('z', 'x', 'y')을 지정하고, offset은 해당 축에서 등고선이 놓일 위치를 결정합니다. 위 예제에서는 세 방향 모두에 서로 다른 컬러맵(plasma, PiYG_r, PuBuGn)을 적용해 입체감과 가독성을 동시에 살렸습니다.
실행 결과
