Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Matplotlib 애니메이션으로 GIF 파일 만들기: PillowWriter 활용 가이드

MatplotlibFuncAnimation을 활용하면 사인 곡선처럼 움직이는 애니메이션을 손쉽게 만들 수 있으며, 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 파일이 생성되며, 움직이는 사인 곡선을 확인할 수 있습니다.