Animações de dispersão 3D Matplotlib

Estou fazendo gráficos de posições em um cluster em estrela, meus dados estão em um quadro de dados com posições x, y, z e um índice de tempo.

Eu sou capaz de produzir uma plotagem de dispersão 3D e estava tentando produzir uma plotagem rotativa - tive algum sucesso, mas lutei através da API de animação.

Se minha função "update_graph" retornar apenas um novo ax.scatter (), o antigo permanecerá plotado, a menos que eu reconstrua o gráfico inteiro. Isso parece ineficiente. Além disso, tenho que definir meu intervalo bastante alto ou minha animação "pula" todos os outros quadros, por isso diz que meu desempenho é bastante ruim. Finalmente, sou forçado a usar o "blit = False", pois não consigo obter um iterador para um gráfico de dispersão 3D. Aparentemente, o "graph.set_data ()" não funciona, e eu posso usar o "graph.set_3d_properties", mas isso me permite apenas novas coordenadas z.

Então, eu juntei um cluuge-- (os dados que eu usei estão emhttps://www.kaggle.com/mariopasquato/star-cluster-simulations role para baixo)

Também estou plotando apenas 100 pontos (data = data [data.id <100])

Meu código (de trabalho) é o seguinte:

def update_graph(num):
     ax = p3.Axes3D(fig)
     ax.set_xlim3d([-5.0, 5.0])
     ax.set_xlabel('X')
     ax.set_ylim3d([-5.0, 5.0])
     ax.set_ylabel('Y')
     ax.set_zlim3d([-5.0, 5.0])
     ax.set_zlabel('Z')
     title='3D Test, Time='+str(num*100)
     ax.set_title(title)
     sample=data0[data0['time']==num*100]
     x=sample.x
     y=sample.y
     z=sample.z
     graph=ax.scatter(x,y,z)
     return(graph)

fig = plt.figure()
ax = p3.Axes3D(fig)

# Setting the axes properties
ax.set_xlim3d([-5.0, 5.0])
ax.set_xlabel('X')
ax.set_ylim3d([-5.0, 5.0])
ax.set_ylabel('Y')
ax.set_zlim3d([-5.0, 5.0])
ax.set_zlabel('Z')
ax.set_title('3D Test')
data=data0[data0['time']==0]
x=data.x
y=data.y
z=data.z
graph=ax.scatter(x,y,z)

# Creating the Animation object
line_ani = animation.FuncAnimation(fig, update_graph, 19, 
                               interval=350, blit=False)
plt.show()

questionAnswers(2)

yourAnswerToTheQuestion