Matplotlib의 FuncAnimation을 활용하면 사인 곡선처럼 움직이는 애니메이션을 손쉽게 만들 수 있으며, PillowWriter 클래스를 사용하면 이를 애니메이션 GIF 파일로 저장할 수 있습니다. 아래에서 단계별로 그 과정을 살펴보겠습니다.
애니메이션 GIF 생성 절차
- 그림(figure) 크기를 설정하고 서브플롯 주변과 사이의 여백(padding)을 조정합니다.
- 새 그림을 생성하거나 기존 그림을 활성화합니다.
- 현재 그림에 축(axes)을 추가하고 이를 현재 축으로 지정합니다.
- 빈 리스트를 사용해 선(line)을 플롯합니다.
- 초기화 함수(init)에서 빈 리스트를 전달하여 선의 초기 상태를 설정합니다.
- 프레임마다 사인 곡선의 값을 갱신하고 선 객체를 반환하여 애니메이션을 구현합니다.
- PillowWriter() 클래스를 사용해 무비 라이터(movie writer) 인스턴스를 생성합니다.
- PillowWriter를 이용해 .gif 파일로 저장합니다.
예제 코드
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
fig = plt.figure()
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
line, = ax.plot([], [], lw=2)
def init():
line.set_data([], [])
return line,
def animate(i):
x = np.linspace(0, 2, 1000)
y = np.sin(2 * np.pi * (x - 0.01 * i))
line.set_data(x, y)
return line,
ani = animation.FuncAnimation(fig, animate, init_func=init, frames=200, interval=20, blit=True)
writer = animation.PillowWriter(fps=25)
ani.save("sine.gif", writer=writer)
코드 설명
위 코드의 핵심 요소는 다음과 같습니다.
- init() 함수: 애니메이션이 시작되기 전에 선을 빈 상태로 초기화합니다.
- animate(i) 함수: 프레임 번호 i에 따라 x축 값을 0부터 2까지 1000개의 구간으로 나누고, 위상이 이동하는 사인파 y값을 계산해 선 데이터를 갱신합니다.
- FuncAnimation: 총 200개의 프레임을 20ms 간격으로 재생하며,
blit=True옵션으로 변경된 부분만 다시 그려 성능을 최적화합니다. - PillowWriter(fps=25): 초당 25프레임으로 GIF를 인코딩하는 라이터입니다. 별도의 외부 도구(예: FFmpeg) 없이 Pillow만으로 GIF 저장이 가능합니다.
실행이 완료되면 작업 디렉터리에 sine.gif라는 이름의 애니메이션 GIF 파일이 생성되며, 움직이는 사인 곡선을 확인할 수 있습니다.