데이터를 시각화할 때 정적인 그래프보다 움직이는 애니메이션이 훨씬 직관적인 경우가 많습니다. Matplotlib의 animation 모듈을 활용하면 선 그래프(line plot)를 손쉽게 애니메이션으로 만들 수 있습니다. 이 글에서는 단계별로 애니메이션 선 그래프를 구현하는 방법을 알아보겠습니다.
애니메이션 선 그래프 구현 단계
subplots() 메서드를 사용해 figure와 subplot을 생성합니다.
x축과 y축의 범위(scale)를 설정합니다.
NumPy를 사용해 x와 t 데이터 포인트를 생성합니다.
좌표 벡터로부터 좌표 행렬 X2와 T2를 반환받습니다.
plot() 메서드로 x와 F 데이터를 사용한 선 그래프를 그립니다.
애니메이션 효과를 위해 y 데이터를 지속적으로 업데이트합니다.
FuncAnimation 함수에 figure, animate 함수, interval 값을 반복 호출하여 애니메이션을 생성합니다.
show() 메서드로 결과 figure를 화면에 표시합니다.
전체 예제 코드
import numpy as np
from matplotlib import pyplot as plt, animation
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
fig, ax = plt.subplots()
ax.set(xlim=(-3, 3), ylim=(-1, 1))
x = np.linspace(-3, 3, 91)
t = np.linspace(1, 25, 30)
X2, T2 = np.meshgrid(x, t)
sinT2 = np.sin(2 * np.pi * T2 / T2.max())
F = 0.9 * sinT2 * np.sinc(X2 * (1 + sinT2))
line, = ax.plot(x, F[0, :], color='k', lw=2)
def animate(i):
line.set_ydata(F[i, :])
anim = animation.FuncAnimation(fig, animate, interval=100, frames=len(t) - 1)
anim.save('503.gif')
plt.show()코드 상세 설명
1. 기본 설정
figure.figsize로 그림 크기를 7.00 × 3.50으로 지정하고, figure.autolayout을 활성화해 레이아웃이 자동으로 조정되도록 합니다.
2. 데이터 생성
np.linspace로 -3부터 3까지 91개의 x 값과, 1부터 25까지 30개의 시간(t) 값을 만듭니다. 이후 np.meshgrid를 통해 좌표 행렬 X2, T2를 생성하고, 사인 함수와 sinc 함수를 조합하여 각 프레임의 y값 배열 F를 계산합니다.
3. 애니메이션 핵심: set_ydata
animate(i) 함수 내부의 line.set_ydata(F[i, :])가 핵심입니다. 프레임 인덱스 i가 바뀔 때마다 y 데이터만 교체하므로 전체 그래프를 다시 그리지 않고도 부드러운 애니메이션을 구현할 수 있습니다.
4. FuncAnimation과 GIF 저장
animation.FuncAnimation(fig, animate, interval=100, frames=len(t)-1)은 100ms 간격으로 animate 함수를 반복 호출합니다. 마지막에 anim.save('503.gif')를 호출하면 완성된 애니메이션을 GIF 파일로 저장할 수도 있습니다.
실행 결과
코드를 실행하면 사인파 형태의 선 그래프가 시간의 흐름에 따라 유동적으로 변하는 애니메이션이 화면에 나타납니다.