3D анимация рассеяния сюжета с блиттингом - PullRequest
0 голосов
/ 10 февраля 2020

Я хочу сделать трехмерную линейную анимацию с нанесенной точкой в ​​последней точке, как траектория для конкретной частицы. В случае без блиттинга я сделал это с помощью точечной диаграммы и линейного сюжета, обновив оба графика в функции обновления. Я попытался сделать это таким же образом, с блиттингом, но он выдает следующую ошибку

TypeError: 'Path3DCollection' object is not iterable

Мой код следующий

import matplotlib.pyplot as m
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D

def ranstep(start,step,stop):
    numberlist = int((stop - start)/step + 1)
    lista = [0]*numberlist
    i = 0
    while i <= numberlist:
        if i == 0:
            lista[i] = start
            i = i + 1
        if i != 0 and i < numberlist - 1:
            lista[i] = lista[i - 1] + step
            i = i + 1
        if i != 0 and i == numberlist - 1:
            lista[i] = stop
            break

    return(lista)

k1 = 10.0
k2 = 28.0
k3 = 8.0/3.0
czeroA = 1
czeroB = 0
czeroC = 0           
step = 0.001
tfinal = 100
time = list(ranstep(0,step,tfinal))

cA = [0]*len(time)
cB = [0]*len(time)
cC = [0]*len(time)

i = 0
while i <= len(time) - 1:
    if i == 0:
        cA[i] = czeroA
        cB[i] = czeroB
        cC[i] = czeroC
        i = i + 1
    else:
        cA[i] = cA[i - 1] + k1*(cB[i - 1] - cA[i - 1])*step
        cB[i] = cB[i - 1] + (cA[i - 1]*(k2 - cC[i - 1]) - cB[i-1])*step
        cC[i] = cC[i - 1] + (cA[i - 1]*cB[i-1] - k3*cC[i-1])*step
        i = i + 1

fig, ax = m.subplots()
ax = fig.add_subplot(111, projection='3d')
line, = ax.plot3D([], [], [], c = 'blue', lw = 1)
line, = ax.scatter([],[],[], c = 'red', s = 30)

def init():
    ax.set_xlim([-20,20])
    ax.set_ylim([-20,20])
    ax.set_zlim([0,50])
    ax.set_xlabel('$x(t)$')
    ax.set_ylabel('$y(t)$')
    ax.set_zlabel('$z(t)$')
    return line,

def update(frame):
    line.set_data(cA[0:frame*50],cB[0:frame*50])
    line.set_3d_properties(cC[0:frame*50])
    line.set_data(cA[frame*500,frame*500 + 1],cB[frame*500,frame*500 + 1])
    line.set_3d_properties(cC[frame*500,frame*500 + 1])
    return line,

ani = animation.FuncAnimation(fig, update,interval=5, frames = len(time),init_func=init, blit=True)

m.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...