我有一个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__
方法时,它们会产生相同的结果。
我在这里做错了什么? 任何帮助都将不胜感激!
答案 0 :(得分:1)
问题在于plt.cla()
。
此命令将清除它在绘图上找到的最后一个活动axes
。添加滑块后,滑块的轴将是要清除的轴,并且曲线的轴保持不变。
因此,解决方案不是让pyplot决定清除哪些轴,而是明确地说明
self.subplot.cla()