Matplotlib에서 애니메이션 기능을 활용하면 플롯의 제목이나 텍스트를 프레임마다 동적으로 변경할 수 있습니다. 이 글에서는 animation.FuncAnimation을 사용해 플롯 위의 텍스트를 반복적으로 업데이트하는 방법을 단계별로 살펴보겠습니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 주변의 여백(padding)을 조정합니다.
- figure() 메서드를 사용해 새 그림을 생성하거나 기존 그림을 활성화합니다.
- NumPy를 이용해 x, y 데이터 포인트를 생성합니다.
- gca() 메서드로 현재 축(axis) 객체를 가져옵니다.
- text() 메서드를 사용해 축에 텍스트를 추가합니다.
- 함수를 반복 호출하여 애니메이션을 만드는 animate() 메서드를 정의합니다.
- show() 메서드로 그림을 화면에 표시합니다.
예제 코드
import numpy as np
from matplotlib import pyplot as plt, animation
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
fig = plt.figure()
x = np.linspace(-10, 10, 1000)
y = np.sin(x)
plt.plot(x, y)
ax = plt.gca()
ax.text(0.5, 1.100, "y=sin(x)", bbox={'facecolor': 'red',
'alpha': 0.5, 'pad': 5},
transform=ax.transAxes, ha="center")
def animate(frame):
ax.texts.clear() # 기존 텍스트 제거로 겹침 방지
ax.text(0.5, 1.100, "y=sin(x), frame: %d" % frame,
bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 5},
transform=ax.transAxes, ha="center")
ani = animation.FuncAnimation(fig, animate, interval=100,
frames=10, repeat=True)
plt.show()코드 설명
위 코드는 -10부터 10까지의 범위에서 사인 곡선(y=sin(x))을 먼저 그립니다. 그런 다음 축 상단에 빨간색 배경의 텍스트 상자를 배치하고, animate() 함수가 프레임 번호를 받아 해당 번호가 포함된 텍스트로 갱신합니다.
FuncAnimation은 interval=100(밀리초)마다 함수를 호출하고 총 10개의 프레임을 반복 재생합니다. 참고로, 원본 코드에서는 매 프레임마다 새 텍스트가 계속 쌓여 겹치는 문제가 있을 수 있으므로, ax.texts.clear()를 추가해 기존 텍스트를 제거하면 더 깔끔한 결과를 얻을 수 있습니다.
실행 결과
코드를 실행하면 플롯 상단의 텍스트 상자에 "y=sin(x), frame: 0", "y=sin(x), frame: 1"처럼 프레임 번호가 실시간으로 바뀌는 애니메이션이 표시됩니다.