使用Matplotlib(Python)对条形图进行动画处理

时间:2020-04-07 14:29:49

标签: python matplotlib

我最近写这是为了刮擦日志,并显示其中最常用的单词的matplotlib.pyplot.bar图

NotImplementedException

我想为所述剧情制作动画,但是,我无法把握import re from datetime import datetime from collections import Counter import matplotlib.pyplot as plt from matplotlib import animation def read_log(path, index, separator=chr(9)): data = [] my_file = open(path,"r+") rows = my_file.readlines() for row in rows: line = re.sub(r'\r\n|\r|\n','',row, flags=re.M) if line != '': data.append(line.split(separator)[index]) my_file.close() return Counter(data) def set_plot(counter_data): plt.title('This is a title') plt.bar(range(len(counter_data)), list(counter_data.values()), align='center') plt.xticks(range(len(counter_data)), list(counter_data.keys())) plt.tight_layout() plt.show() counter_data = read_log(r'logfile.txt',2) print(counter_data) set_plot(counter_data)

你能帮我吗?

我添加了以下几行:

animation.FuncAnimation()

并删除fig = plt.Figure() animation.FuncAnimation(fig, set_plot(counter_data), frames=20)

所以我可以给FuncAnimation一个空的数字(fig)和该函数。但这是行不通的。编辑:并且它也不会显示错误。

2 个答案:

答案 0 :(得分:0)

主要问题是FuncAnimation需要一个可返回艺术家对象的可调用对象。可调用对象将使用frame参数重复调用。

在您的示例中,set_plot()被调用一次。它的返回值(None)传递给FuncAnimation。相反,您应该有一种方法,例如update_plot()从文件中加载数据,更新条形图并返回条形图。此函数(函数本身)应传递给FuncAnimation

 animation.FuncAnimation(fig, update_plot, frames=20)

不用打电话!请注意,update_plot之后缺少括号。 animitation documentation显示了如何完成此操作的示例。

答案 1 :(得分:0)

看来您的数据是静态的(您一次从文件获取数据并且它没有改变),所以我不太了解您要制作动画的内容。但是,您的代码包含需要修复的错误,因此出于演示目的,我将在动画的每个步骤中增加每个高度的增量。

第一个错误是将参数传递给函数的方式。对于参数,您必须使用fargs参数,否则在您的版本中,您传递的是函数的结果而不是函数本身。

您必须具有一个功能(在我的版本中为animate,在您的版本中为set_plot),该功能可以更新动画每一步的绘图。 (就您而言,您每次都只输入相同的数据)

该函数需要接受至少一个参数(val),该参数将与我的FuncAnimation一起使用,该参数将从迭代器获取的值传递给其frames参数。

最终代码如下:

import re
from datetime import datetime
from collections import Counter
import matplotlib.pyplot as plt
from matplotlib import animation
# uncomment if using in jupyter notebook
# %matplotlib nbagg 

def read_log(path, index, separator=chr(9)):
    data = []
    my_file = open(path,"r+")
    rows = my_file.readlines()
    for row in rows:
        line = re.sub(r'\r\n|\r|\n','',row, flags=re.M)
        if line != '':
            data.append(line.split(separator)[index])
    my_file.close()
    return Counter(data)

fig = plt.figure()
ax = fig.add_subplot()
counter_data = read_log(r'tmp.csv',2)
plt.title('This is a title')
bar = ax.bar(range(len(counter_data)), list(counter_data.values()), align='center')
plt.xticks(range(len(counter_data)), list(counter_data.keys()))
plt.tight_layout()
plt.ylim((0, 30))


def animate(val, counter_data):
    data = list(counter_data.values())
    for i in range(len(data)):
        bar[i].set_height(data[i]+val)

animation.FuncAnimation(fig, func=animate, frames=20, fargs=[counter_data], save_count=10)

,我们得到以下动画:

animation


修改

对于错误,您可以尝试将动画保存为gif,错误会显示出来

anim = animation.FuncAnimation(fig, func=animate, frames=20, fargs=[counter_data], save_count=10)
anim.save('anim.gif', 'imagemagick')