我想为3D散点图制作动画,其中每个数据点都有一个随其移动的文本标签。
现在,文本标签 do 随心所欲地跟随数据点,但它们在每一帧中都保持不变;文本不会在上一次动画更新中消失。参见下图。数据点本身运行良好。
2个问题的答案可能对我有帮助>
这是绘图功能:
def graph(data, update_cnt):
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
dots = ax.scatter(data[0][0][:], data[1][0][:], data[2][0][:])
dot_txt = nmp.ones(nmp.size(data,2), dtype=str)
for n in range(0,nmp.size(data, 2)):
dot_txt[n] = ax.text(data[0][0][n], data[1][0][n], data[2][0][n],'%s'%(n))
ani = animation.FuncAnimation(fig, update, update_cnt, fargs=(dots, data, dot_txt, ax), interval=300)
plt.show()
和动画更新功能:
def update(num, dots, data, dot_txt, ax):
y = data[0][num][:]
x = data[1][num][:]
z = data[2][num][:]
dots._offsets3d = (x, y, z)
#dot_txt._something_to_update_text_here()
dot_txt = nmp.ones(nmp.size(data,2), dtype=str)
for n in range(0,nmp.size(data, 2)):
dot_txt[n] = ax.text(data[1][num][n], data[0][num][n], data[2][num][n],'%s'%(n))
答案 0 :(得分:0)
我找到了解决方案。
我认为需要注意的是,我不能对3D动画散点图使用更常见的解决方案,因为我需要为各个点使用不同的标记样式。这迫使我迭代绘制每个散点,而不是将列表传递给更新函数。但是,这样做可以很好地解决文本动画问题。
frame_list 包含每一帧中每个数据点的x,y,z坐标和样式。
def graph(frame_list):
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
frame_cnt = len(frame_list)
ani = animation.FuncAnimation(fig, update_graph, frame_cnt,
fargs=(frame_list, ax, frame_cnt), interval=600)
plt.show()
此操作成功的最大原因是在每帧之前进行 ax.clear()调用。
def update_graph(f, frame_list, ax, cnt):
ax.clear()
f = nmp.mod(f, cnt)
frame = frame_list[f]
for n in range(len(frame.marker)):
x, y, z, s, c, m, name = frame.get_params(n)
ax.scatter(x, y, z, s=s, c=c, marker=m)
ax.text(x, y, z, '%s'%(name))
get_params 函数返回该框架的所有相关数据。