Matplotlib에서 시간 순서대로 정렬된 플롯 시퀀스를 애니메이션으로 표현하려면 다음 단계를 따르면 됩니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.
- 새 그림을 생성하거나 기존 그림을 활성화합니다.
- 서브플롯 배치의 일부로 그림에 축(axes)을 추가합니다.
- after() 메서드를 사용하여 지정된 datetime 인스턴스 이후 첫 번째 재귀 호출을 반환합니다.
- 애니메이션을 위한 animate() 메서드를 작성합니다. 데이터를 이미지 형태, 즉 2D 규칙 래스터(raster)로 표시합니다.
- 그림을 화면에 표시하려면 show() 메서드를 사용합니다.
예제 코드
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
fig = plt.figure()
ax = fig.add_subplot(111)
def animate():
data = np.random.randn(5, 5)
im = plt.imshow(data, cmap="plasma")
for i in np.arange(1, 100):
data = np.random.randn(5, 5)
im.set_data(data)
fig.canvas.draw()
win = fig.canvas.manager.window
fig.canvas.manager.window.after(10, animate)
plt.show()코드 설명
위 코드의 핵심 동작 방식은 다음과 같습니다.
- np.random.randn(5, 5): 5×5 크기의 난수 배열을 생성하여 매 프레임마다 새로운 데이터를 만듭니다.
- plt.imshow(): 생성된 데이터를 'plasma' 컬러맵을 적용한 이미지로 렌더링합니다.
- im.set_data(data): 기존 이미지 객체의 데이터만 교체하여 전체를 다시 그리는 것보다 효율적으로 화면을 갱신합니다.
- fig.canvas.draw(): 캔버스를 강제로 다시 그려 변경된 내용을 즉시 반영합니다.
- window.after(10, animate): Tkinter 이벤트 루프를 활용해 10밀리초 후에 animate 함수를 호출함으로써 반복적인 애니메이션 효과를 만듭니다.
실행 결과
코드를 실행하면 'plasma' 컬러맵이 적용된 5×5 히트맵이 약 10밀리초 간격으로 계속 새로운 난수 데이터로 갱신되며, 마치 실시간으로 변화하는 데이터 흐름을 보는 듯한 애니메이션 효과를 확인할 수 있습니다.
참고 사항
이 방식은 TkAgg 백엔드에 의존하는 after() 메서드를 사용하기 때문에, 다른 백엔드 환경에서는 matplotlib.animation.FuncAnimation 클래스를 사용하는 것이 더 안정적이고 범용적입니다. FuncAnimation은 Jupyter Notebook 환경에서도 잘 작동하며, GIF나 MP4 등의 파일로 애니메이션을 저장할 수도 있습니다.