Matplotlib에서 컬러바(colorbar)에 애니메이션 효과를 적용하면 프레임이 바뀔 때마다 데이터와 색상 매핑이 함께 변화하는 동적인 시각화를 만들 수 있습니다. 이 글에서는 FuncAnimation과 make_axes_locatable을 활용해 컬러바를 애니메이션으로 구현하는 방법을 단계별로 살펴보겠습니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 사이와 주변의 여백(padding)을 조정합니다.
- 새 figure를 생성하거나 기존 figure를 활성화합니다.
- 서브플롯 배치의 일부로 figure에 Axes(축)를 추가합니다.
- 기존 축(ax 객체)을 기반으로 Divider를 생성하고, 지정된 셀에 대한 새로운 축 로케이터(axis locator)를 반환받습니다.
- 메인 축과 동일한 높이(또는 너비)를 가지는 위치에 새로운 축을 생성합니다.
- numpy를 사용하여 랜덤 데이터를 만듭니다.
- imshow() 메서드로 랜덤 데이터를 플롯합니다.
- 플롯의 제목을 설정합니다.
- 여러 컬러맵(cmap)을 담은 리스트를 준비합니다.
- animate() 함수 내에서 매 프레임마다 컬러바를 갱신하여 애니메이션을 구현합니다.
- show() 메서드로 최종 figure를 화면에 표시합니다.
예제 코드
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
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)
plt.show()코드 설명
컬러바 전용 축 만들기
make_axes_locatable(ax)는 기존 축에 딱 맞게 정렬되는 보조 축을 손쉽게 추가할 수 있게 해주는 도구입니다. div.append_axes('right', '5%', '5%')를 호출하면 메인 축 오른쪽에 폭 5%, 간격 5% 크기의 컬러바 전용 축(cax)이 생성됩니다. 이렇게 하면 컬러바가 항상 메인 플롯과 높이를 유지하며 깔끔하게 배치됩니다.
애니메이션 함수의 동작 원리
animate(i) 함수는 프레임 번호 i를 인자로 받아 매번 호출됩니다. 함수 내부에서는 먼저 cax.cla()로 기존 컬러바를 지운 뒤, 새로운 랜덤 데이터를 생성하고 cmap[i % len(cmap)]을 통해 컬러맵 리스트를 순환하며 적용합니다. 이후 fig.colorbar(im, cax=cax)로 갱신된 데이터에 맞는 컬러바를 다시 그리고, 제목도 현재 프레임 번호로 업데이트합니다.
FuncAnimation으로 프레임 연결하기
animation.FuncAnimation(fig, animate, frames=10)은 위에서 정의한 animate 함수를 10개 프레임에 걸쳐 반복 실행하여 애니메이션을 완성합니다. 실행 결과, 데이터 패턴과 컬러맵이 프레임마다 바뀌면서 컬러바도 실시간으로 함께 변화하는 것을 확인할 수 있습니다.
마무리
이처럼 Matplotlib에서는 make_axes_locatable로 컬러바 전용 축을 확보하고, FuncAnimation의 콜백 함수 안에서 컬러바를 지웠다가 다시 그리는 방식으로 손쉽게 애니메이션을 구현할 수 있습니다. 시간에 따라 변하는 데이터(예: 열 분포 변화, 시뮬레이션 결과 등)를 시각화할 때 이 기법을 활용하면 훨씬 직관적인 결과물을 얻을 수 있습니다.