Matplotlib 서브플롯 애니메이션 생성

Beginner

This tutorial is from open-source community. Access the source code

소개

이 단계별 랩은 Python 의 Matplotlib 을 사용하여 여러 서브플롯 (subplot) 으로 애니메이션을 만드는 방법을 보여줍니다. 이 예제는 두 개의 서로 다른 서브플롯에서 원과 사인 곡선을 애니메이션하는 방법을 보여줍니다.

VM 팁

VM 시작이 완료되면, 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 접근하십시오.

때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.

학습 중에 문제가 발생하면 Labby 에게 문의하십시오. 세션 후에 피드백을 제공해주시면 문제를 신속하게 해결해 드리겠습니다.

라이브러리 임포트 (Import Libraries)

첫 번째 단계는 Matplotlib, NumPy 및 Matplotlib 의 animation 모듈을 포함하여 필요한 라이브러리를 임포트하는 것입니다.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
from matplotlib.patches import ConnectionPatch

Figure 및 Subplot 생성

두 번째 단계는 애니메이션에 사용될 figure 와 subplot 을 생성하는 것입니다. 이 예제에서는 서로 다른 종횡비 (aspect ratio) 를 가진 두 개의 subplot 을 나란히 생성합니다. 왼쪽 subplot 은 단위 원이고, 오른쪽 subplot 은 사인 곡선을 애니메이션하는 데 사용될 빈 플롯입니다.

fig, (axl, axr) = plt.subplots(
    ncols=2,
    sharey=True,
    figsize=(6, 2),
    gridspec_kw=dict(width_ratios=[1, 3], wspace=0),
)
axl.set_aspect(1)
axr.set_box_aspect(1 / 3)
axr.yaxis.set_visible(False)
axr.xaxis.set_ticks([0, np.pi, 2 * np.pi], ["0", r"$\pi$", r"$2\pi$"])

원과 초기 점 그리기

세 번째 단계는 왼쪽 subplot 에 원과 초기 점을 그리는 것입니다. 원을 생성하기 위해 각도 배열을 생성한 다음 각 각도의 사인과 코사인을 플롯합니다. 또한 원점에 단일 점을 플롯합니다.

x = np.linspace(0, 2 * np.pi, 50)
axl.plot(np.cos(x), np.sin(x), "k", lw=0.3)
point, = axl.plot(0, 0, "o")

사인 곡선 그리기

네 번째 단계는 오른쪽 subplot 에 사인 곡선을 그리는 것입니다. 각도 배열을 생성한 다음 각 각도의 사인을 플롯합니다. 또한 애니메이션에서 나중에 업데이트할 sine 플롯 객체를 저장합니다.

sine, = axr.plot(x, np.sin(x))

연결선 그리기

다섯 번째 단계는 두 subplot 을 연결하는 점선 (dotted line) 을 그리는 것입니다. 왼쪽 subplot 의 원점을 오른쪽 subplot 의 오른쪽 가장자리 (right edge) 에 연결하는 ConnectionPatch 객체를 생성합니다. 또한 애니메이션에서 나중에 업데이트할 con 패치 객체를 저장합니다.

con = ConnectionPatch(
    (1, 0),
    (0, 0),
    "data",
    "data",
    axesA=axl,
    axesB=axr,
    color="C0",
    ls="dotted",
)
fig.add_artist(con)

애니메이션 함수 정의

여섯 번째 단계는 애니메이션 함수를 정의하는 것입니다. 이 함수는 애니메이션의 각 프레임마다 호출되며, 왼쪽 subplot 의 점 위치, 오른쪽 subplot 의 사인 곡선의 위치 및 데이터, 그리고 연결 패치의 위치를 업데이트합니다.

def animate(i):
    x = np.linspace(0, i, int(i * 25 / np.pi))
    sine.set_data(x, np.sin(x))
    x, y = np.cos(i), np.sin(i)
    point.set_data([x], [y])
    con.xy1 = x, y
    con.xy2 = i, y
    return point, sine, con

애니메이션 생성

일곱 번째 단계는 FuncAnimation 함수를 사용하여 애니메이션 객체를 생성하는 것입니다. 우리는 figure 객체, 애니메이션 함수, 프레임 간 간격 (interval, 밀리초 단위), 프레임 수, 그리고 애니메이션을 반복하기 전의 지연 시간을 전달합니다.

ani = animation.FuncAnimation(
    fig,
    animate,
    interval=50,
    blit=False,  ## blitting can't be used with Figure artists
    frames=x,
    repeat_delay=100,
)

애니메이션 표시

마지막 단계는 pyplot 모듈의 show 함수를 사용하여 애니메이션을 표시하는 것입니다.

plt.show()

요약

이 단계별 랩 (lab) 에서는 Python 의 Matplotlib 을 사용하여 여러 개의 서브플롯 (subplot) 을 가진 애니메이션을 만드는 방법을 시연했습니다. 이 예제는 두 개의 서로 다른 서브플롯에서 원과 사인 곡선을 애니메이션하는 방법을 보여주었습니다. 단계는 라이브러리 가져오기, figure 및 서브플롯 생성, 원과 초기 점 그리기, 사인 곡선 그리기, 연결선 그리기, 애니메이션 함수 정의, 애니메이션 객체 생성, 그리고 애니메이션 표시를 포함했습니다.