matplotlib:条形图动画只能运行一次

时间:2020-08-04 19:07:55

标签: python matplotlib animation jupyter-notebook

我已经使用FuncAnimation的{​​{1}}方法实现了动画。

代码中没有错误,但我不知道问题出在哪里!

代码:

matplotlib.animation

输出:

matplotlib output image

PS 1: 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 的值为877。

PS 2:我认为问题在于可视化方法的返回。因此,我更改了代码,但仍无法正常工作。

1 个答案:

答案 0 :(得分:1)

我相信您正在Jupyter笔记本中运行代码。在这种情况下,您应该在代码的开头添加%matplotlib notebook
作为参考,请尝试运行在this answer中可以找到的代码,以查看它是否为您运行。


编辑

我在笔记本中实现了部分代码。由于我不知道self.percentagesself.window_sizeself.get_distributionsself.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)

结果是this

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

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