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

Matplotlib로 산점도 애니메이션을 만들고 GIF로 저장하는 방법

데이터 시각화에서 산점도(scatter plot) 애니메이션은 시간에 따른 데이터의 변화를 직관적으로 보여주는 강력한 도구입니다. Python의 matplotlib 라이브러리를 활용하면 산점도 애니메이션을 손쉽게 만들고 .gif 파일로 저장할 수 있습니다.

아래 단계별 과정과 전체 예제 코드를 통해 그 방법을 자세히 알아보겠습니다.

산점도 애니메이션 저장 절차

  • 그림(figure) 크기를 설정하고 서브플롯 주변 및 사이의 여백(padding)을 조정합니다.
  • steps(프레임 수), nodes(노드 수), positions(위치), solutions(값) 네 가지 변수를 초기화합니다.
  • 반복문을 사용하여 각 프레임의 위치와 값 데이터를 리스트에 추가합니다.
  • plt.subplots()으로 그림과 서브플롯을 생성합니다.
  • 마커(marker) 크기 변수를 초기화합니다.
  • ax.grid()로 격자선(grid line)을 설정합니다.
  • FuncAnimation을 이용해 animate 함수를 반복 호출하여 축을 초기화하고, 새로운 서브플롯을 추가한 뒤 해당 축에 산점도를 그립니다.
  • 완성된 애니메이션 산점도를 .gif 파일로 저장합니다.

전체 예제 코드

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

# 그림 크기 및 자동 레이아웃 설정
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

steps = 50      # 프레임 수
nodes = 100     # 노드(점) 수
positions = []  # 위치 데이터 저장 리스트
solutions = []  # 색상 값 저장 리스트

# 각 프레임별 무작위 데이터 생성
for i in range(steps):
    positions.append(np.random.rand(2, nodes))
    solutions.append(np.random.random(nodes))

fig, ax = plt.subplots()
marker_size = 50  # 마커 크기

# 애니메이션 프레임을 그리는 함수
def animate(i):
    fig.clear()
    ax = fig.add_subplot(111, aspect='equal', autoscale_on=False,
                         xlim=(0, 1), ylim=(0, 1))
    ax.set_xlim(0, 1)
    ax.set_ylim(0, 1)
    s = ax.scatter(positions[i][0], positions[i][1], s=marker_size,
                   c=solutions[i], cmap="RdBu_r", marker="o",
                   edgecolor='black')

ax.grid(b=None)

# FuncAnimation으로 애니메이션 생성
ani = animation.FuncAnimation(fig, animate, interval=100,
                              frames=range(steps))

# GIF 파일로 저장
ani.save('animation.gif', writer='pillow')

코드 핵심 포인트

1. 데이터 준비

np.random.rand()np.random.random()을 사용해 각 프레임마다 노드의 x, y 좌표와 색상 값을 무작위로 생성합니다. 실제 프로젝트에서는 시뮬레이션 결과나 센서 데이터 등 원하는 데이터로 대체할 수 있습니다.

2. animate 함수

animate(i) 함수는 프레임 인덱스 i를 인자로 받으며, 매 프레임마다 fig.clear()로 기존 그림을 지운 후 새로운 서브플롯을 추가하고 해당 프레임의 산점도를 다시 그립니다.

3. FuncAnimation과 저장

interval=100은 프레임 간 간격을 100ms로 지정하며, writer='pillow'를 사용해 Pillow 이미지 라이브러리로 GIF 파일을 인코딩합니다. 참고로 ax.grid(b=None)b 파라미터는 최신 matplotlib 버전에서 deprecated되었으므로, 최신 버전을 사용한다면 ax.grid(visible=None) 또는 생략하는 것이 좋습니다.

실행 결과

코드를 실행하면 작업 디렉터리에 animation.gif 파일이 생성되며, 빨강-파랑(RdBu_r) 컬러맵이 적용된 산점도 점들이 프레임마다 무작위로 움직이는 애니메이션을 확인할 수 있습니다.