我正在绘制一个星星中的位置,我的数据在一个 Dataframe 中,其中包含x,y,z位置以及时间索引。
我能够产生一个三维散点图,并试图产生一个旋转图-我已经取得了一定的成功,但挣扎通过动画API。
如果我的“update_graph”函数返回一个新的ax。scatter(),旧的保持绘图,除非我重建整个图。这似乎效率低下。同时,我必须设置我的间隔相当高或我的动画“跳过”每隔一帧,所以它说我的表现相当糟糕。最后,我被迫使用“blit=False”,因为我无法获得3D散点图的迭代器。显然是“图表。set_data()”不起作用,我可以使用“图。set_3d_properties”,但这只允许我使用新的z坐标。
所以我拼凑了一个cluuge--(我使用的数据是在https://www.kaggle.com/mariopasquato/star-cluster-simulations滚动到底部)
另外,我只绘制了100个点(data=data[ www.example.com 〈100])
我的(工作)代码如下:
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()
2条答案
按热度按时间q1qsirdb1#
3D中的散点图是
mpl_toolkits.mplot3d.art3d.Path3DCollection
对象。这提供了一个属性_offsets3d
,它托管一个元组(x,y,z)
,并可用于更新散射点的坐标。因此,在动画的每次迭代上不创建整个图而是仅更新其点可能是有益的。下面是一个关于如何做到这一点的工作示例。
此解决方案不允许位块传输。然而,根据使用情况,可能根本不需要使用散点图;使用**normal
plot
**可能同样可行,这允许进行位块传输-如以下示例所示。nkoocmlb2#
如果使用Jupyter Notebook,请记住使用
%matplotlib notebook
,不要使用%matplotlib inline
。