为了账号安全,请及时绑定邮箱和手机立即绑定

matplotlib:条形图动画只能工作一次

matplotlib:条形图动画只能工作一次

慕姐8265434 2023-04-25 15:40:07
我已经使用FuncAnimation的方法实现了一个动画matplotlib.animation。代码没有错误,但我不知道问题到底出在哪里!代码:def visualization(self):    fig = plt.figure()        def animation_frame(i):        print(i)        trimmed_dist = self.get_distributions(i, self.window_size + i)        # create labels                     label_no = len(trimmed_dist)        labels = []        for index in range(label_no):            from_ = index * self.bucket_length            to_ = (index + 1) * self.bucket_length            label = '{:.2f} - {:.2f}'.format(from_, to_)            labels.append(label)                #create bar chart        colors = plt.cm.Dark2(range(label_no))        plt.xticks(rotation=90)        plt.bar(x=labels, height=trimmed_dist, color=colors)            frames_no = len(self.percentages) - self.window_size    print('frames_no:', frames_no)    animation = FuncAnimation(fig, animation_frame, frames=frames_no, interval=1000)    return animation输出:PS 1:值为frame_no877。PS 2:我认为问题在于可视化方法中的返回。所以我已经更改了代码,但它仍然无法正常工作。
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

我相信您正在 Jupyter 笔记本中运行您的代码。%matplotlib notebook在这种情况下,您应该在代码的开头添加。
中找到的代码,以查看它是否适合您。


编辑

我在笔记本中实现了你的部分代码。由于我不知道self.percentagesself.window_size和是什么self.get_distributions以及self.bucket_length它们有哪些值,为了简单起见,我设置了labels = ['a', 'b', 'c']trimmed_dist = [3*i, 2*i, i**2],以便运行一个简单的动画。
这是我的代码:

%matplotlib notebook

from matplotlib.animation import FuncAnimation

import matplotlib.pyplot as plt


def animation_frame(i):

    plt.gca().cla()

    

    labels = ['a', 'b', 'c']

    trimmed_dist = [3*i, 2*i, i**2]

    label_no = len(trimmed_dist)

    

    colors = plt.cm.Dark2(range(label_no))

    plt.xticks(rotation=90)

    plt.bar(x=labels, height=trimmed_dist, color=colors)

    plt.title(f'i = {i}') # this replaces print(i)

    plt.ylim([0, 100])    # only for clarity purpose


fig = plt.figure()

frames_no = 877

print('frames_no:', frames_no)

animation = FuncAnimation(fig, animation_frame, frames=frames_no, interval=1000)

这就是结果。

我添加plt.gca().cla()是为了在每次迭代时擦除前一帧。
print(i)声明对我也不起作用,所以我将其替换plt.title(f'i = {i}')为 order 以便写i在标题中。相反,print('frames_no:', frames_no)工作正常。

如您所见,我的动画运行了,所以请尝试实现我对您的代码所做的更改。
如果动画仍然不运行,请尝试检查self.percentagesself.window_sizeself.get_distributionsself.bucket_length值和类型,以确保正确计算labels和。trimmed_dist


查看完整回答
反对 回复 2023-04-25
  • 1 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信