Последовательная анимация сюжета на одной фигуре - PullRequest
0 голосов
/ 30 января 2019

Следуя примеру галереи matplotlib , я хочу построить дискретный путь Леви (должен быть расширен для настройки 2D или 3D).Итак, я начал с простого графика (время, броуновский путь) и хотел имитировать прыжки, просто «склеивая» разные пути.Вот минимальный рабочий пример:

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


np.random.seed(19680801)

def generateRandomLines(dt, T, N):
    t = np.linspace(0,T,N)

    dX = np.sqrt(dt) * np.random.randn(1, N)
    X = np.cumsum(dX, axis=1)

    lineData = np.vstack((t,X))

    return lineData

# Returns Line2D objects
def updateLines(num, dataLines, lines):
    for u, v in zip(lines, dataLines):
        u.set_data(v[:2, :num])
    return lines


N = 500 # Number of points
T = .5
dt = T/(N-1)


fig, ax = plt.subplots()

data = [
        [generateRandomLines(dt, T, N),'violet'],
        [.5+generateRandomLines(dt, T, N),'violet'],
        [1+generateRandomLines(dt, T, N),'violet'],
        [1.5+generateRandomLines(dt, T, N),'violet'],
        ]

ax = plt.axes(xlim=(-.5, 2.5), ylim=(-2.5, 2.5))

ax.set_xlabel('t')
ax.set_ylabel('B(t)')
ax.set_title('2D Brownian Paths')

## Create a list of line2D objects
dataLines = [dat[0] for dat in data]
lines = [ax.plot(dat[0][0, 0:1], dat[0][1, 0:1], color=dat[1])[0] for dat in data]

## Create the animation object
anim = animation.FuncAnimation(fig, updateLines, N+1, fargs=(dataLines, lines),
                               interval=20, repeat=False, blit=False)

plt.tight_layout()
plt.show()

На данный момент четыре пути, сгенерированные в data, построены / анимированы одновременно.Но я хочу, чтобы анимированные объекты отображались один за другим на одном и том же рисунке.

Очевидно, я не совсем понимаю, как обрабатывать объекты lines и dataLines в функции

def updateLines(num, dataLines, lines):
    for u, v in zip(lines, dataLines):
        u.set_data(v[:2, :num])
    return lines

Похоже на вопрос ("Последовательная анимация matplotlib на одном рисунке") Я попытался перебрать объект lines, который выдает ошибку с zip («аргумент # 1 должен поддерживать итерацию»).

Заранее спасибо.

1 Ответ

0 голосов
/ 30 января 2019

Переопределение updateLines следующим образом решает мою проблему

# Returns Line2D objects
def updateLines(num, dataLines, lines):
    if num < N:
        lines[0].set_data(dataLines[0][:2, :num])
    elif num < N * 2:
        lines[1].set_data(dataLines[1][:2, :num-N])
    elif num < N * 3:
        lines[2].set_data(dataLines[2][:2, :num-2*N])
    else:
        lines[3].set_data(dataLines[3][:2, :num-3*N])
    return lines

и соответственно увеличивает количество точек до N * 4 + 1

## Create the animation object
anim = animation.FuncAnimation(fig, updateLines, N * 4 + 1, fargs=(dataLines, lines),
                               interval=20, repeat=False, blit=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...