我最近写这是为了刮擦日志,并显示其中最常用的单词的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)和该函数。但这是行不通的。编辑:并且它也不会显示错误。
答案 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)
,我们得到以下动画:
修改:
对于错误,您可以尝试将动画保存为gif,错误会显示出来
anim = animation.FuncAnimation(fig, func=animate, frames=20, fargs=[counter_data], save_count=10)
anim.save('anim.gif', 'imagemagick')