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

IPython 노트북에서 Matplotlib 애니메이션이 작동하지 않을 때 해결하는 방법

Matplotlib에서 플롯 애니메이션을 만들려면 FuncAnimation 클래스를 활용하면 됩니다. 하지만 IPython이나 Jupyter Notebook 환경에서는 일반적인 plt.show()만으로는 애니메이션이 제대로 재생되지 않는 경우가 많습니다. 이 글에서는 기본적인 애니메이션 작성 방법과 함께, 노트북 환경에서 애니메이션이 작동하지 않을 때의 해결 방법까지 함께 살펴보겠습니다.

애니메이션 구현 단계

  • 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변 여백을 조정합니다.
  • 10×10 형태의 무작위 데이터를 생성합니다.
  • subplots() 메서드를 사용해 그림과 서브플롯 세트를 만듭니다.
  • FuncAnimation() 클래스를 사용해 지정한 함수를 반복 호출함으로써 애니메이션을 생성합니다.
  • 프레임마다 등고선(contour) 값을 갱신할 수 있도록 animate 함수를 정의하고, 이를 FuncAnimation()에 전달합니다.
  • 그림을 화면에 표시하려면 show() 메서드를 사용합니다.

예제 코드

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
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, 5, interval=50, blit=False)
plt.show()

위 코드를 실행하면 8개 프레임으로 구성된 무작위 등고선 데이터가 반복 재생되는 애니메이션을 확인할 수 있습니다.

Jupyter/IPython 환경에서 애니메이션이 보이지 않을 때

1. 인터랙티브 백엔드 사용하기

노트북 최상단에 아래 매직 명령어 중 하나를 추가하면 인터랙티브한 애니메이션 재생이 가능합니다.

%matplotlib notebook   # Jupyter Notebook 클래식 환경
# 또는
%matplotlib widget     # ipympl 설치 후 JupyterLab 환경

%matplotlib inline은 정적 이미지만 렌더링하므로, 애니메이션이 멈춰 있는 것처럼 보일 수 있습니다.

2. JavaScript HTML로 변환하여 출력하기

인터랙티브 백엔드 없이도 애니메이션을 재생하려면 to_jshtml()을 이용해 HTML 객체로 변환하는 방법이 가장 확실합니다.

from IPython.display import HTML
HTML(ani.to_jshtml())

이 방법은 브라우저 내장 플레이어로 애니메이션을 재생해 주기 때문에 대부분의 노트북 환경에서 안정적으로 동작합니다.

3. GIF 파일로 저장하기

노트북 외부에서 공유하거나 문서에 삽입해야 한다면 GIF로 저장하는 것이 좋습니다.

ani.save("animation.gif", writer="pillow", fps=5)

정리

IPython 노트북에서 Matplotlib 애니메이션이 작동하지 않는 가장 흔한 원인은 정적(inline) 백엔드 사용입니다. %matplotlib notebook 또는 %matplotlib widget으로 인터랙티브 백엔드를 설정하거나, HTML(ani.to_jshtml()) 방식을 사용하면 대부분의 문제를 해결할 수 있습니다.