Matplotlib에서 3D plot_surface에 애니메이션 효과를 적용하면 시간에 따라 변화하는 곡면 데이터를 직관적으로 시각화할 수 있습니다. 아래 단계를 따라가면 간단하게 구현할 수 있습니다.
구현 단계
- 메시 그리드 개수(N), 함수 호출 빈도인 초당 프레임 수(fps), 총 프레임 수(frn)에 해당하는 변수를 초기화합니다.
- 곡면을 표현할 x, y, z 배열을 생성합니다.
- 람다(lambda) 함수를 이용해 z 배열을 만드는 함수를 정의합니다.
- 애니메이션 클래스에 함수를 전달하기 위해, 기존 플롯을 제거한 뒤 x, y, z 배열로 새로운 곡면을 그리는 사용자 정의 함수를 작성합니다.
- 새 figure를 생성하거나 기존 figure를 활성화합니다.
- subplots() 메서드를 사용해 서브플롯 배치를 추가합니다.
- set_zlim() 메서드로 Z축의 표시 범위를 설정합니다.
- 애니메이션 클래스를 호출하여 곡면 플롯을 움직이게 합니다.
- 마지막으로 show() 메서드를 사용해 결과 화면을 출력합니다.
예제 코드
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
N = 50
fps = 250
frn = 75
x = np.linspace(-4, 4, N + 1)
x, y = np.meshgrid(x, x)
zarray = np.zeros((N + 1, N + 1, frn))
f = lambda x, y, sig: 1 / np.sqrt(sig) * np.exp(-(x ** 2 + y ** 2) / sig ** 2)
for i in range(frn):
zarray[:, :, i] = f(x, y, 1.5 + np.sin(i * 2 * np.pi / frn))
def change_plot(frame_number, zarray, plot):
plot[0].remove()
plot[0] = ax.plot_surface(x, y, zarray[:, :, frame_number], cmap="afmhot_r")
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
plot = [ax.plot_surface(x, y, zarray[:, :, 0], color='0.75', rstride=1, cstride=1)]
ax.set_zlim(0, 1.1)
ani = animation.FuncAnimation(fig, change_plot, frn, fargs=(zarray, plot), interval=1000 / fps)
ax.axis('off')
plt.show()코드 설명
위 예제에서는 가우시안(Gaussian) 형태의 함수를 사용해 시간(프레임)에 따라 높이가 변하는 3차원 곡면을 생성합니다. change_plot 함수는 매 프레임마다 이전 곡면을 제거하고 새로운 z 값으로 곡면을 다시 그리는 역할을 하며, FuncAnimation 클래스가 이 함수를 주기적으로 호출해 애니메이션을 완성합니다. 컬러맵 afmhot_r을 적용해 곡면의 높이 차이를 색상으로도 한눈에 확인할 수 있습니다.
실행 결과
