소개
이 단계별 랩은 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 및 서브플롯 생성, 원과 초기 점 그리기, 사인 곡선 그리기, 연결선 그리기, 애니메이션 함수 정의, 애니메이션 객체 생성, 그리고 애니메이션 표시를 포함했습니다.