如何在3D散点图中对文本进行动画处理?

时间:2018-12-23 20:16:54

标签: python matplotlib mplot3d

我想为3D散点图制作动画,其中每个数据点都有一个随其移动的文本标签。

现在,文本标签 do 随心所欲地跟随数据点,但它们在每一帧中都保持不变;文本不会在上一次动画更新中消失。参见下图。数据点本身运行良好。

2个问题的答案可能对我有帮助>

  1. 是否有某种方法可以清除文本而不清除数据点?
  2. 我的实现似乎有些笨拙。是否有类似于 _offset3d 的隐藏函数可用于文本对象。

这是绘图功能

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))

和当前的图输出3D scatter plot text animation attempt

1 个答案:

答案 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 函数返回该框架的所有相关数据。