防止动画对象在python matplotlib动画中消失
我正在尝试使用matplotlib的动画功能设置多个对象的动画。默认情况下,动画功能在每次调用动画函数以及更改线或面片或其他对象的位置时都会擦除对象的旧实例。(当然,这就是动画的全部要点)。但我有两个不同的对象需要设置动画:一条在方位角上扫过极坐标图的直线和散射标记。我不想让标记消失。我希望它们在绘制完成后在整个动画中保持不变 我尝试了一些不同的方法,比如将“标记”散点添加到列表中并返回它,但是在返回动画函数时遇到了问题。以下是基本代码,不需要尝试附加到列表中。我删减了很多图形和轴的设置。当该代码处于该位置时,线在绘图周围扫掠,当它到达标记所在的点时,标记闪烁然后消失防止动画对象在python matplotlib动画中消失,python,animation,matplotlib,Python,Animation,Matplotlib,我正在尝试使用matplotlib的动画功能设置多个对象的动画。默认情况下,动画功能在每次调用动画函数以及更改线或面片或其他对象的位置时都会擦除对象的旧实例。(当然,这就是动画的全部要点)。但我有两个不同的对象需要设置动画:一条在方位角上扫过极坐标图的直线和散射标记。我不想让标记消失。我希望它们在绘制完成后在整个动画中保持不变 我尝试了一些不同的方法,比如将“标记”散点添加到列表中并返回它,但是在返回动画函数时遇到了问题。以下是基本代码,不需要尝试附加到列表中。我删减了很多图形和轴的设置。当该代
fig = plt.figure(1)
ax = fig.add_subplot(111,projection='polar')
ax.set_theta_zero_location('N',offset=0)
ax.set_theta_direction(-1)
line, = ax.plot((0,0),(0,0))
list = []
def animate(i):
line.set_data((0,line_az_time[i][0]),(0,300))
if(line_az_time[i][1] in marker_time):
marker = plt.scatter(marker_az[0],marker_range[0])
list.append(marker)
del marker_az[0]
del marker_range[0]
return line, list # wrong return type?
return line, list # how to handle empty list before 1st marker appended?
def init():
line.set_data((0,0),(0,300))
return line,
ani = animation.FuncAnimation(fig,animate,np.arange(len(line_az_time)),
blit=True,interval=0,repeat=True,init_func=init)
plt.show()
“line_az_time”是一个嵌套列表,其格式为[[angle1,time1],[angle2,time2]…]
基本上,它保存了一个角度和角度出现的时间。“marker_xxx”变量是目标检测的角度、范围和时间。当线条设置动画时,它将检查是否在该时间和角度发生检测。时间和检测总是连续的,所以我只要在绘制它们之后删除它们
基本上,我所需要的就是在整个动画中保持“标记”分散点。如前所述,我尝试将它们附加到列表中并返回列表,而不是“marker”本身。这样,一旦它们发生,它们都会被密谋。但那没用。我想我对将它们打包到什么类型的变量以及在将它们附加到变量后如何写入“返回”行感到困惑
或者,如果有其他方法,我也愿意这样做。我认为显示您(未成功)尝试返回标记列表的代码是有意义的,因为这肯定更接近您想要实现的目标。@ImportanceOfBeingErnest好的,我添加了列表尝试。我不确定返回列表的正确方法,这样FuncAnimate就可以在列表中循环绘制所有标记。错误是:“AttributeError:'list'对象没有属性'set_animated'”。此外,在第一次标记检测之前,列表为空,即使我们确定了正确的返回类型,这也可能是一个问题。请使用
[line]+list
,因为预期返回的是单个列表。使用if list:return list+[line]else:return line,
区分第一个和所有后续案例。备选方案:不要使用blit
并通过管理绘图。如果需要,请删除。@ImportanceOfBeingErnest非常感谢!这就成功了。