【问题标题】:How to animate two patches concurrently in python pyplot animation如何在python pyplot动画中同时为两个补丁设置动画
【发布时间】:2017-05-06 19:34:47
【问题描述】:

我想同时为图表上的两组补丁设置动画。例如椭圆和箭头。我可以单独执行此操作,但不能一次执行。我使用 pyplot 动画 FuncAnimation。

我收到以下错误:

文件“/usr/lib/python3/dist-packages/matplotlib/animation.py”,第 1199 行,在 _init_draw 中 a.set_animated(self._blit) AttributeError: 'list' 对象没有属性 'set_animated'

代码如下:

def initiate_chart(self, axes, title='Layout'):
    self.title = title
    plt.title = self.title
    self.ax = plt.axes(xlim=(axes[0]['xmin'], axes[0]['xmax']), ylim=(axes[0]['ymin'], axes[0]['ymax']))
    elipses = [Ellipse(i, width=0.6, height=0.3, angle=0) for i in self.trajectory[0]]
    arrows = [Arrow(x, y, self.velocities[0][i][0], self.velocities[0][i][1])
              for (i, (x, y)) in enumerate(self.trajectory[0])]
    [self.pedestrians.append(self.ax.add_patch(elipses[i])) for i in range(len(elipses))]
    [self.arrows.append(self.ax.add_patch(arrows[i])) for i in range(len(arrows))]

def init_animation(self):
    [self.pedestrians[i].set_visible(True) for i in range(len(self.pedestrians))]
    [self.arrows[i].set_visible(True) for i in range(len(self.arrows))]
    return self.pedestrians, self.arrows

def animate(self, i):
    self.arrows = []
    for j in range(len(self.pedestrians)):
        angle = degrees(atan2(self.trajectory[i][j][0], self.trajectory[i][j][1]))
        self.pedestrians[j].center = self.trajectory[i][j]
        self.pedestrians[j].angle = angle
        self.arrows.append(self.ax.add_patch(Arrow(self.trajectory[i][j][0], self.trajectory[i][j][1],
                                 self.velocities[i][j][0], self.velocities[i][j][1], width=0.5)))
    return self.pedestrians, self.arrows

def do_animation(self, n_frames, n_interval):
    anim = animation.FuncAnimation(self.fig, self.animate, init_func=self.init_animation, frames=n_frames,
                                   interval=n_interval, blit=True)

【问题讨论】:

    标签: python animation matplotlib


    【解决方案1】:

    我认为您的问题是您的 animate 函数返回 2 个列表的元组(因为 self.pedestriansself.arrows 都是一个列表)。

    animate 函数应该返回一个艺术家列表。

    您应该尝试以下方法:

    def animate(self, i):
        (...)
        artists = self.pedestrians + self.arrows # concatenate lists of artists
        return artists
    

    【讨论】:

    • 谢谢,这就是问题所在。工作正常。
    • 不客气。如果您的问题现已得到解答,请考虑通过单击左侧的复选标记来接受答案
    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多