Matplotlib 를 이용한 3D 랜덤 워크 애니메이션

Beginner

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

소개

이 랩에서는 Python 의 Matplotlib 라이브러리를 사용하여 애니메이션 3D 랜덤 워크 플롯을 만드는 방법을 배웁니다. 3D 플롯을 생성하고 3D 공간에서 무작위로 움직이는 40 개의 입자를 사용하여 랜덤 워크를 시뮬레이션합니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 액세스하십시오.

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

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

필요한 라이브러리 가져오기

필요한 라이브러리를 가져오는 것으로 시작합니다. 랜덤 숫자를 생성하기 위해 numpy를 사용하고, 플롯을 생성하기 위해 matplotlib를 사용합니다.

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

랜덤 워크 함수 정의

주어진 단계 수와 최대 단계 크기로 랜덤 워크를 생성하는 함수를 정의합니다. 이 함수는 두 개의 입력을 받습니다: num_steps는 랜덤 워크의 총 단계 수이고, max_step은 각 단계의 최대 크기입니다. numpy.random을 사용하여 단계에 대한 랜덤 숫자를 생성하고, numpy.cumsum을 사용하여 단계의 누적 합을 계산하여 최종 위치를 얻습니다.

def random_walk(num_steps, max_step=0.05):
    """Return a 3D random walk as (num_steps, 3) array."""
    start_pos = np.random.random(3)
    steps = np.random.uniform(-max_step, max_step, size=(num_steps, 3))
    walk = start_pos + np.cumsum(steps, axis=0)
    return walk

업데이트 함수 정의

애니메이션의 각 프레임에 대해 플롯을 업데이트하는 함수를 정의합니다. 이 함수는 세 개의 입력을 받습니다: num은 현재 프레임 번호이고, walks는 모든 랜덤 워크의 목록이며, lines는 플롯의 모든 선의 목록입니다. 각 선과 워크에 대해, 현재 프레임 번호까지 선의 x, y, z 좌표에 대한 데이터를 업데이트합니다. line.set_data()line.set_3d_properties()를 사용하여 각각 x-y 및 z 좌표를 업데이트합니다.

def update_lines(num, walks, lines):
    for line, walk in zip(lines, walks):
        ## NOTE: there is no .set_data() for 3 dim data...
        line.set_data(walk[:num, :2].T)
        line.set_3d_properties(walk[:num, 2])
    return lines

랜덤 워크 생성

앞서 정의한 random_walk() 함수를 사용하여 각각 30 단계로 구성된 40 개의 랜덤 워크를 생성합니다. 모든 랜덤 워크를 walks라는 리스트에 저장합니다.

## Data: 40 random walks as (num_steps, 3) arrays
num_steps = 30
walks = [random_walk(num_steps) for index in range(40)]

3D 플롯 생성

matplotlib을 사용하여 3D 플롯을 생성합니다. 각 랜덤 워크에 대해 빈 선을 플롯에 추가합니다. x, y, z 축의 범위를 0 과 1 사이로 설정합니다.

## Attaching 3D axis to the figure
fig = plt.figure()
ax = fig.add_subplot(projection="3d")

## Create lines initially without data
lines = [ax.plot([], [], [])[0] for _ in walks]

## Setting the axes properties
ax.set(xlim3d=(0, 1), xlabel='X')
ax.set(ylim3d=(0, 1), ylabel='Y')
ax.set(zlim3d=(0, 1), zlabel='Z')

애니메이션 생성

matplotlib.animationFuncAnimation 클래스를 사용하여 애니메이션을 생성합니다. FuncAnimation 생성자에 figure 객체, 업데이트 함수, 총 프레임 수 (랜덤 워크의 단계 수와 같음), 모든 랜덤 워크의 리스트, 그리고 모든 선의 리스트를 인수로 전달합니다.

## Creating the Animation object
ani = animation.FuncAnimation(
    fig, update_lines, num_steps, fargs=(walks, lines), interval=100)

애니메이션 표시

마지막으로, plt.show()를 사용하여 애니메이션을 표시합니다.

plt.show()

요약

Python 에서 Matplotlib 라이브러리를 사용하여 애니메이션 3D 랜덤 워크 플롯을 생성하는 방법을 배웠습니다. 랜덤 워크를 생성하고 애니메이션의 각 프레임에 대해 플롯을 업데이트했습니다. 이 기술은 3D 공간에서 입자 이동, 확산 및 기타 확률적 프로세스를 시각화하는 데 사용할 수 있습니다.