Python의 matplotlib에서 등고선 플롯(contour plot)에 애니메이션 효과를 적용하려면 matplotlib.animation 모듈의 FuncAnimation 클래스를 활용하면 됩니다. 전체 과정을 단계별로 살펴보겠습니다.
구현 단계
- 먼저 10×10 크기의 랜덤 데이터를 생성합니다.
- subplots() 메서드를 사용해 Figure와 서브플롯(axes)을 만듭니다.
- FuncAnimation() 클래스가 함수를 반복적으로 호출하도록 하여 애니메이션을 구성합니다.
- 등고선 값을 각 프레임마다 업데이트하기 위해 animate 함수를 정의하고, 이를 FuncAnimation에 전달합니다.
- 마지막으로 show() 메서드로 결과 그림을 화면에 표시합니다.
예제 코드
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
# 10 x 10 x 8 형태의 랜덤 데이터 생성
data = np.random.randn(800).reshape(10, 10, 8)
fig, ax = plt.subplots()
def animate(i):
ax.clear()
ax.contourf(data[:, :, i])
ani = animation.FuncAnimation(fig, animate, frames=5, interval=50, blit=False)
plt.show()코드 설명
np.random.randn(800).reshape(10, 10, 8)은 총 800개의 난수를 생성한 뒤 이를 10×10×8 형태의 3차원 배열로 변환합니다. 여기서 마지막 축(8)은 애니메이션 프레임 수에 해당합니다.
animate(i) 함수는 프레임 인덱스 i를 받아 해당 시점의 데이터 슬라이스(data[:, :, i])로 등고선을 다시 그립니다. 매 프레임마다 ax.clear()를 호출해 이전 등고선을 지운 후 새로 그리는 방식입니다.
FuncAnimation(fig, animate, frames=5, interval=50, blit=False)에서는 총 5개의 프레임을 사용하며, 각 프레임 사이의 간격은 50밀리초(ms)입니다. 등고선 플롯은 아티스트 객체를 반환하지 않는 경우가 많아 blit=False로 설정하는 것이 안전합니다.
실행 결과
코드를 실행하면 랜덤 데이터의 등고선 분포가 프레임마다 부드럽게 변화하는 애니메이션이 새 창에 표시됩니다. GIF 파일로 저장하려면 ani.save('animation.gif', writer='pillow') 코드를 추가하면 됩니다.