当Slider添加到图

时间:2017-01-19 00:39:48

标签: python animation matplotlib

我有一个3D散点图的动画。动画是使用实现的 来自FuncAnimation的{​​{1}}。一切正常,直到我在图中添加一个滑块。然后动画中的帧仍然存在,我看到在旧帧的顶部绘制的每个新帧(参见附图)。我不太了解matplotlib.animation如何工作(试错)所以,我无法弄清楚突然出现的问题。

以下是我如何运行动画的详细说明。

动画在我命名为FuncAnimation的类中处理,当类初始化时我首先使用以下方法创建3D图形:

MyAnim

然后我运行启动动画循环的class MyAnim(object): """Animates points on 3D wireplot""" def __init__(self, [...]): [...] self.fig = plt.figure(figsize = (8,8)) self.subplot = self.fig.add_subplot(111, projection='3d') self.subplot._axis3don = False anim方法:

MyAnim

def anim(self): """Sets the animation loop""" frames = [...] self.anim = animation.FuncAnimation(self.fig, self.animate3d, frames, init_func = self.init, interval = 50, blit = False, repeat= False) 中我初始化一个虚拟散点图(单个透明(self.init)点为零)。

alpha = 0

动画本身涉及重新评估线图def init(self): """Animation initialization""" self.subplot_3d_wires = self.subplot.scatter([0], [0], [0], c = RED, s = 100, alpha = 0) return [self.subplot_3d_wires] 的网格点的位置以及红色(next_pos)和蓝色({{的散点的新位置)。 1}})然后在线图上绘制。

所以情节的这两个组成部分是:

x_red, y_red, z_red

我想逐渐用滑块something along this question替换动画,所以首先我想在我的动画旁边添加一个滑块(x_blue, y_blue, z_blue)(不以任何方式连接到动画) )。但是只是在图上声明了sil,动画就变坏了 - 我看到我的情节叠加在另一个上面,看到图。

我尝试使用

实例化滑块
def animate3d(self, i):

    plt.cla() 

    [...]

    next_pos = get_next_pos(i)

    [...]

    for j in range(X_SIZE ** 2):            

        step_l = (j) * Z_SIZE
        step_r = (j + 1) * Z_SIZE
        self.subplot_3d_wires = self.subplot.plot_wireframe(next_pos[step_l:step_r, 0], 
                                                            next_pos[step_l:step_r, 1], 
                                                            next_pos[step_l:step_r, 2], 
                                                            rstride = 1, 
                                                            cstride = 1, 
                                                            alpha = 0.2, 
                                                            antialiased = True)

    [...]
    (x_red, y_red, z_red) = get_new_red(i)
    (x_blue, y_blue, z_blue) = get_new_blue(i)

    self.subplot_3d_wires = self.subplot.scatter(x_red, y_red, z_red, s = 150, c = RED,  depthshade = False, lw = 0, alpha = 1)
    self.subplot_3d_wires = self.subplot.scatter(x_blue, y_blue, z_blue, s = 150, c = BLUE,  depthshade = False, lw = 0, alpha = 1)

    [...]

    return [self.subplot_3d_wires]

from matplotlib.widgets import Slider类的 axcolor = 'lightgoldenrodyellow' axtime = plt.axes([0.25, 0.1, 0.65, 0.03]) self.stime = Slider(axtime, 'Time', 0.0, 100.0, valinit = 50.0) 中,或者当我为动画启动__init__方法时,它们会产生相同的结果。

我在这里做错了什么? 任何帮助都将不胜感激!

Before the slider is added animation goes smoothly

with the slider the frames overlay one on top of the other

1 个答案:

答案 0 :(得分:1)

问题在于plt.cla()。 此命令将清除它在绘图上找到的最后一个活动axes。添加滑块后,滑块的轴将是要清除的轴,并且曲线的轴保持不变。

因此,解决方案不是让pyplot决定清除哪些轴,而是明确地说明

self.subplot.cla()