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

matplotlib 애니메이션에서 ffmpeg를 올바르게 활성화하는 방법

matplotlib의 animation 모듈은 그래프를 동영상으로 저장할 때 ffmpeg 작성기(writer)를 사용합니다. 이 기능을 정상적으로 사용하려면 시스템에 ffmpeg가 먼저 설치되어 있어야 하며, matplotlib가 해당 실행 파일의 경로를 찾을 수 있도록 설정해야 합니다.

ffmpeg 활성화 절차

  • 그림 크기를 설정하고 서브플롯 사이 및 주변 여백(padding)을 조정합니다.
  • plt.rcParams['animation.ffmpeg_path'] 옵션으로 ffmpeg 실행 파일 경로를 지정합니다.
  • figure() 메서드를 사용해 새 그림을 생성하거나 기존 그림을 활성화합니다.
  • 서브플롯 배치의 일부로 그림에 축(ax)을 추가합니다.
  • make_axes_locatable을 이용해 기존 축을 기준으로 분할자(divider)를 구성합니다.
  • 표시할 무작위 데이터를 생성하고, imshow() 메서드로 2D 래스터 이미지 형태로 출력합니다.
  • ScalarMappable 인스턴스인 cb에 대한 컬러바(colorbar)를 생성합니다.
  • 제목(title)을 현재 프레임 번호로 설정합니다.
  • 순환해서 사용할 컬러맵(cmap) 목록을 준비합니다.
  • animate 함수를 반복 호출하는 방식으로 애니메이션을 만듭니다. 이 함수는 새로운 무작위 데이터를 생성한 뒤 imshow()로 화면에 갱신합니다.
  • 파이프(pipe) 기반 FFMpegWriter 인스턴스를 생성합니다.
  • ani.save()를 호출해 현재 애니메이션 그림을 MP4 파일로 저장합니다.

예제 코드

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.axes_grid1 import make_axes_locatable

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
plt.rcParams['animation.ffmpeg_path'] = 'ffmpeg'

fig = plt.figure()
ax = fig.add_subplot(111)
div = make_axes_locatable(ax)
cax = div.append_axes('right', '5%', '5%')
data = np.random.rand(5, 5)
im = ax.imshow(data)
cb = fig.colorbar(im, cax=cax)
tx = ax.set_title('Frame 0')

cmap = ["copper", "RdBu_r", "Oranges", "cividis", "hot", "plasma"]

def animate(i):
    cax.cla()
    data = np.random.rand(5, 5)
    im = ax.imshow(data, cmap=cmap[i%len(cmap)])
    fig.colorbar(im, cax=cax)
    tx.set_text('Frame {0}'.format(i))

ani = animation.FuncAnimation(fig, animate, frames=10)
FFwriter = animation.FFMpegWriter()
ani.save('plot.mp4', writer=FFwriter)

실행 결과

위 코드를 실행하면 각 프레임마다 무작위 데이터가 새로 생성되고, 프레임마다 컬러맵이 순환하면서 변경됩니다. 최종적으로 프로젝트 디렉터리에 'plot.mp4'라는 이름의 동영상 파일이 저장됩니다.

참고 사항

만약 실행 시 MovieWriter ffmpeg unavailable과 같은 오류가 발생한다면, ffmpeg가 시스템에 설치되지 않았거나 PATH에 등록되어 있지 않은 경우입니다. 이때는 운영체제에 맞게 ffmpeg를 설치한 후, plt.rcParams['animation.ffmpeg_path']에 ffmpeg 실행 파일의 전체 경로(예: Windows의 경우 'C:/ffmpeg/bin/ffmpeg.exe')를 명시적으로 지정해 주면 문제를 해결할 수 있습니다.