Matplotlib 3D scatter animations : <p>I am graphing out positions in a star cluster, my data is in a dataframe with x,y,z positions as well as a time index.</p>

<p>I am able to produce a 3d scatter plot and was trying to produce a rotating plot--I have been somewhat successful, but struggling through the animation API.</p>

<p>If my "update_graph" function just returns a new ax.scatter(), the old one stays plotted unless i rebuild the entire graph.  That seems inefficient.  As well, I have to set my interval rather high or my animation "skips" every other frame, so it says my performance is rather bad.  Finally I am forced to use the "blit=False" as I cannot get an iterator for a 3d scatter plot.  Apparently the "graph.set_data()" doesn't work, and I can use the "graph.set_3d_properties" but that allows me new z coordinates only.  </p>

<p>So i have cobbled together a cluuge-- (data i used is at 
<a href="https://www.kaggle.com/mariopasquato/star-cluster-simulations" rel="noreferrer">https://www.kaggle.com/mariopasquato/star-cluster-simulations</a> 
scroll to bottom)</p>

<p>Also I am only plotting 100 points (data=data[data.id&lt;100])</p>

<p>My (working) code is as follows:</p>

<pre><code>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()
</code></pre>
