Skip to content
튜토리얼
Matplotlib
Matplotlib Animation Tutorial - Stunning Visualizations 만들기

Matplotlib Animation Tutorial - Stunning Visualizations 만들기

데이터 시각화는 사용하는 사람에게 강력한 도구입니다. 복잡한 데이터셋을 이해하기 쉬운 통찰력으로 바꿀 수 있으며 애니메이션을 사용하면 이러한 통찰력을 더욱 흥미롭게 만들 수 있습니다. 이때 파이썬의 다재다능한 라이브러리인 Matplotlib이 등장합니다. Matplotlib을 사용하면 정적, 동적 및 대화식 시각화를 모두 만들 수 있으므로 데이터 과학자나 분석가에게 필수적인 도구입니다.

이 튜토리얼에서는 Matplotlib의 애니메이션 기능에 초점을 맞출 것입니다. 애니메이션을 생성하는 방법, 애니메이션화할 수 있는 다양한 종류의 플롯 및 애니메이션을 저장할 수 있는 다양한 형식에 대해 알아볼 것입니다. 또한 Jupyter 노트북에서 애니메이션이 작동하지 않는 등의 일반적인 문제를 다룰 것이며 이러한 문제에 대한 해결책을 제공할 것입니다. 그래서 더 경험 많은 데이터 과학자이든 초보자이든 이 튜토리얼은 여러분에게 유익한 내용을 제공할 것입니다.

Python Pandas 데이터프레임에서 빠르게 데이터 시각화를 생성하고 싶나요?

PyGWalker는 시각화를 위한 타블로 스타일 유저 인터페이스로 pandas 데이터프레임 (및 polars 데이터프레임)을 변환하여 Jupyter Notebook 데이터 분석 및 데이터 시각화 작업 흐름을 단순화하는 파이썬 라이브러리입니다. PyGWalker (opens in a new tab)를 사용해보세요!

PyGWalker로 데이터 시각화하기 (opens in a new tab)

Matplotlib 애니메이션이란?

Matplotlib 애니메이션은 동적 시각화를 생성할 수 있는 Matplotlib 라이브러리의 기능입니다. 정적 플롯과는 달리 애니메이션은 시간에 따른 변화를 보여줄 수 있어 시계열 데이터를 표현하는 데 뛰어난 도구입니다. 예를 들어 연도별 주가, 최근 10년간의 기후 변화 또는 시간에 따라 변화하는 모든 현상을 애니메이션을 사용하여 효과적으로 표현할 수 있습니다.

Matplotlib의 애니메이션 모듈에는 애니메이션을 생성하는 프레임워크를 제공하는 여러 클래스가 있습니다. 이 중에서 가장 중요한 것은 FuncAnimation 클래스입니다. 이 클래스는 함수를 반복 호출함으로써 애니메이션을 생성하는 데 사용됩니다. 이 클래스를 사용하면 각 프레임마다 플롯의 상태(또는 데이터)가 업데이트되는 애니메이션을 쉽게 만들 수 있습니다.

Matplotlib을 사용하여 애니메이션 만들기

Matplotlib에서 애니메이션을 만드는 것은 몇 가지 단계를 거칩니다. 먼저 플롯의 figure와 축을 설정해야 합니다. 그런 다음 데이터를 갱신하는 애니메이션 함수를 정의합니다. 마지막으로 FuncAnimation 클래스의 인스턴스를 생성하여 피규어, 애니메이션 함수 및 프레임 수를 인수로 전달합니다.

다음은 간단한 선 플롯 애니메이션을 만드는 예시입니다:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
# 피규어와 축 설정
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'r-')
 
def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return ln,
 
def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,
 
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init, blit=True)
plt.show()

이 예시에서 init 함수는 플롯 제한을 설정하고 선 객체(ln)를 반환합니다. update 함수는 각 프레임마다 호출되어 새 데이터(프레임 번호의 사인)를 ydata에 추가하고 선 객체의 데이터를 업데이트합니다. FuncAnimation 클래스를 사용하여 애니메이션을 만듭니다.

Matplotlib으로 애니메이션화할 수 있는 플롯 유형

Matplotlib은 다양한 플롯을 애니메이션화할 수 있도록 매우 다재다능합니다. 다음은 몇 가지 예시입니다:

  1. 선 그래프: 이전 섹션에서 본 것처럼 선 그래프를 애니메이션화하여 시간에 따른 하나 이상의 양이 어떻게 변화하는지 보여줄 수 있습니다. 이는 특히 시계열 데이터에 유용합니다.

  2. 산포 그래프: 산포 그래프를 애니메이션화하여 2D 공간에서 점의 이동을 보여줄 수 있습니다. 이는 데이터 포인트의 클러스터링이나 분류를 시간에 따라 시각화하는 데 사용할 수 있습니다.

  3. 막대 그래프: 막대 그래프는 막대의 높이로 표시되는 양의 변화를 시각화하는 데 사용할 수 있습니다. 이를 통해 데이터셋의 변화를 시간에 따라 시각화할 수 있습니다.

  4. 히스토그램: 히스토그램을 애니메이션화하여 데이터셋의 분포 변화를 시각화할 수 있습니다.

  5. 3D 그래프: Matplotlib은 3D 플로팅도 지원합니다. 3D 그래프를 애니메이션화하여 3D 데이터셋의 변화를 보여줄 수 있습니다. 이는 3D 과학 데이터를 시각화하는 데 유용합니다.

  6. 서브플롯: 여러 개의 서브플롯을 동시에 애니메이션화할 수 있습니다. 이는 다른 데이터셋이나 동일한 데이터셋의 다른 시각을 비교하는 데 사용할 수 있습니다.

기억하세요, 애니메이션화할 플롯 유형은 데이터의 특성과 시각화를 통해 전달하려는 내용에 따라 결정해야 합니다.

Matplotlib 애니메이션 저장하기

애니메이션을 만든 후에는 나중에 사용하기 위해 저장하거나 다른 사람과 공유하기를 원할 수 있습니다. 이를 위해 Matplotlib은 Animation.save 메서드를 제공합니다. 이 메서드를 사용하면 MP4, AVI, HTML5 비디오 등 다양한 형식으로 애니메이션을 저장할 수 있습니다.

다음은 애니메이션을 저장하는 예시입니다:

ani.save('animation.mp4', writer='ffmpeg', fps=30)

이 예제에서는 FFmpeg writer를 사용하여 애니메이션을 MP4 파일로 저장합니다. fps 매개변수는 저장된 애니메이션의 초당 프레임 수를 지정합니다.

애니메이션을 저장하려면 시스템에 적합한 writer가 설치되어 있어야 한다는 점에 유의해야 합니다. 대부분의 일반적인 형식의 경우, Matplotlib은 자동으로 적합한 writer를 사용합니다. 그러나 일부 형식에는 추가 소프트웨어를 설치해야 할 수도 있습니다. 예를 들어 MP4 파일로 애니메이션을 저장하려면 시스템에 FFmpeg가 설치되어 있어야 합니다.

이 튜토리얼의 다음 부분에서는 Matplotlib을 사용하여 애니메이션화할 수 있는 다양한 종류의 플롯에 대해 자세히 다룰 것이며, 각각에 대한 예제도 제공합니다. 또한 3D 플롯을 애니메이션화하는 방법, 진행 상황 표시줄 애니메이션을 만드는 방법 및 플롯에 텍스트 애니메이션을 추가하는 방법에 대해서도 설명할 것입니다. 기대해 주세요!

Matplotlib을 사용한 3D 플롯 애니메이션화

Matplotlib의 3D 기능을 활용하면 데이터 시각화에 차원을 더할 수 있는 흥미로운 애니메이션을 만들 수 있습니다. 이 프로세스는 2D 애니메이션을 만드는 것과 유사하지만, 2D 플롯을 만드는 대신 Axes3D 클래스를 사용하여 3D 플롯을 만듭니다.

다음은 3D 표면 애니메이션을 만드는 예시입니다:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from mpl_toolkits.mplot3d import Axes3D
 
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
 
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
x, y = np.meshgrid(x, y)
z = np.sin(np.sqrt(x**2 + y**2))
 
def update(num):
    ax.view_init(elev=10., azim=num)
    return ln,
 
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 100), blit=True)
plt.show()

이 예제에서 update 함수는 각 프레임마다 플롯의 보기 각도를 변경하여 회전 효과를 만듭니다.

Matplotlib을 사용한 진행 상황 표시줄 애니메이션화

진행 상황 표시줄은 계산이나 프로세스의 진행 상황을 시각화하는 좋은 방법입니다. Matplotlib을 사용하면 실시간으로 업데이트되는 애니메이션 진행 바를 만들 수 있습니다. 간단한 예시를 살펴보겠습니다:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
fig, ax = plt.subplots()
bar = plt.bar([0], [0], color='b')
 
def update(i):
    bar[0].set_height(i / 100.)
    return bar
 
ani = FuncAnimation(fig, update, frames=range(101), repeat=False)
plt.show()

이 예제에서 각 프레임마다 막대의 높이가 업데이트되어 진행 바가 채워지는 효과가 만들어집니다.

Matplotlib 플롯에 텍스트 애니메이션 추가하기

플롯에 애니메이션 텍스트를 추가하면 정보를 더 추가할 수 있고 흥미를 더할 수 있습니다. Matplotlib 플롯에서 Text 클래스와 FuncAnimation 클래스를 사용하여 텍스트를 애니메이션화할 수 있습니다. 예시를 살펴보겠습니다:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
fig, ax = plt.subplots()
text = ax.text(0.5, 0.5, '', ha='center')
 
def update(i):
    text.set_text(f'프레임 {i}')
    return text,
 
ani = FuncAnimation(fig, update, frames=range(10), blit=True)
plt.show()

이 예제에서 플롯에 표시되는 텍스트는 각 프레임마다 업데이트되어 간단한 텍스트 애니메이션을 만듭니다.

Matplotlib을 사용한 여러 서브플롯 애니메이션화

Matplotlib은 단일 그림 내에서 여러 서브플롯을 생성할 수 있으며, 이러한 서브플롯은 개별적으로 애니메이션화될 수 있습니다. 이는 다른 데이터 세트를 비교하거나 동일한 데이터 세트의 다른 동영상을 옆으로 나란히 표시하고자 할 때 특히 유용합니다. 여러 서브플롯을 애니메이션화하는 방법 예시를 살펴보겠습니다:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
fig, axs = plt.subplots(2)
 
x = np.linspace(0, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
 
line1, = axs[0].plot(x, y1, color='blue')
line2, = axs[1].plot(x, y2, color='red')
 
def update(frame):
    line1.set_ydata(np.sin(x + frame / 100))
    line2.set_ydata(np.cos(x + frame / 100))
    return line1, line2
 
ani = FuncAnimation(fig, update, frames=range(100), blit=True)
plt.show()

이 예제에서는 두 개의 서브플롯이 있습니다. 하나는 사인 파형을 보여주고, 다른 하나는 코사인 파형을 보여줍니다. update 함수는 파동의 위상을 변경하여 두 개의 파가 동시에 움직이는 애니메이션을 만듭니다.

색상 팔레트 변경 애니메이션화

애니메이션의 색상 팔레트를 변경하면 시각화에 추가 정보를 더할 수 있습니다. 예를 들어, 2D 플롯에서 세 번째 차원을 나타내거나 특정 데이터 포인트를 강조하기 위해 색상을 사용할 수 있습니다. 색상 팔레트가 변경된 애니메이션을 만드는 방법 예시를 살펴보겠습니다:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib.cm import get_cmap
 
fig, ax = plt.subplots()
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
scat = ax.scatter(x, y, c=y, cmap=get_cmap('viridis'))
 
def update(frame):
    y = np.sin(x + frame / 100)
    scat.set_offsets(np.c_[x, y])
    scat.set_array(y)
    return scat,
 
ani = FuncAnimation(fig, update, frames=range(100), blit=True)
plt.show()

이 예제에서는 scatter 함수를 사용하여 사인 파형의 산포도 그래프를 만듭니다. 각 포인트의 색상은 y 값에 따라 결정됩니다. update 함수는 파동의 위상을 변경하고 포인트의 색상을 업데이트하여 색상 팔레트가 변경되는 움직이는 파의 애니메이션을 만듭니다.

Matplotlib을 사용한 실시간 데이터 애니메이션화

Matplotlib 애니메이션은 실시간 데이터를 시각화하는 데에도 사용할 수 있습니다. 이는 센서 데이터 모니터링, 주식 가격 추적 또는 기계 학습 알고리즘 시각화와 같은 다양한 응용 분야에서 유용할 수 있습니다. 실시간 데이터를 애니메이션화하는 방법 예시를 살펴보겠습니다:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
fig, ax = plt.subplots()
line, = ax.plot([])
 
def update(frame):
    line.set_data(range(frame), np.random.rand(frame))
    ax.relim()
    ax.autoscale_view()
    return line,
 
ani = FuncAnimation(fig, update, frames=range(1, 101), blit=True)
plt.show()
 
이 예제에서 `update` 함수는 각 프레임마다 새로운 무작위 데이터 포인트를 생성하여 실시간 데이터를 모사합니다. 플롯 제한은 새로운 데이터를 수용하도록 각 프레임마다 업데이트됩니다.
 
## Matplotlib를 사용하여 과학적 시뮬레이션 애니메이션화하기
 
Matplotlib의 애니메이션 기능은 과학적 시뮬레이션을 시각화하는 데 사용할 수 있습니다.
 
예를 들어, 물리 시뮬레이션에서 입자의 운동, 생물학 시뮬레이션에서 인구의 증가, 역학 시뮬레이션에서 질병의 전파 등을 애니메이션화할 수 있습니다. 다음은 튕기는 공의 간단한 물리 시뮬레이션을 애니메이션화하는 방법을 보여주는 예입니다:
 
```python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
fig, ax = plt.subplots()
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ball = plt.Circle((5, 5), 0.5, color='blue')
ax.add_patch(ball)
 
vx, vy = 0.1, 0.2  # 속도
 
def update(frame):
    x, y = ball.center
    x += vx
    y += vy
    if x > 10 or x < 0:  # 테두리에 부딪히면 튕김
        vx *= -1
    if y > 10 or y < 0:
        vy *= -1
    ball.center = (x, y)
    return ball,
 
ani = FuncAnimation(fig, update, frames=range(100), blit=True)
plt.show()

이 예제에서 update 함수는 공의 위치를 속도에 따라 업데이트하고, 공이 플롯의 가장자리에 닿으면 속도를 반대로 바꿔 튕기는 공의 애니메이션을 만듭니다.

자주 묻는 질문

  1. Matplotlib 애니메이션이란 무엇인가요?
    Matplotlib 애니메이션은 파이썬의 Matplotlib 라이브러리의 기능으로, 동적 시각화를 만들 수 있게 합니다. 정적 플롯과 달리 애니메이션은 시간에 따라 변화를 보여줄 수 있어 시계열 데이터를 표현하는 데 탁월한 도구입니다.

  2. Matplotlib를 사용하여 애니메이션을 만드는 방법은 무엇인가요?
    Matplotlib에서 애니메이션을 만드는 것은 플롯의 도면과 축을 설정하고, 각 프레임에서 데이터를 업데이트하는 애니메이션 함수를 정의하고, FigAnimation 클래스의 인스턴스를 생성하는 과정을 포함합니다. 이때, 인자로는 도면, 애니메이션 함수 및 프레임 수가 전달됩니다.

  3. Matplotlib로 어떤 종류의 그래프를 애니메이션화할 수 있나요?
    Matplotlib를 사용하면 선 플롯, 산점도, 막대 그래프, 히스토그램, 3D 그래프, 서브플롯 등 다양한 종류의 그래프를 애니메이션화할 수 있습니다.