Кажется, ваши данные устарели c (вы получаете их из файла один раз, и они не меняются), поэтому я не совсем понимаю, что вы пытаетесь оживить. Но ваш код содержит ошибки, которые необходимо исправить, поэтому в демонстрационных целях я добавлю приращение каждой из высот на каждом шаге анимации.
Первая ошибка в том, что вы передаете аргументы своей функции. Для аргументов вы должны использовать параметр fargs
, иначе в вашей версии вы передаете результат функции, а не саму функцию.
У вас должна быть функция (animate
в моей версии, set_plot
в ваш), который обновляет сюжет для каждого шага вашей анимации. (в вашем случае вы просто помещаете одни и те же данные каждый раз)
Эта функция должна принимать хотя бы один параметр (val
), который используется my 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](https://i.stack.imgur.com/Or6py.gif)
Редактировать :
При ошибках вы можете попытаться сохранить анимацию в формате GIF, и ошибки будут отображаться
anim = animation.FuncAnimation(fig, func=animate, frames=20, fargs=[counter_data], save_count=10)
anim.save('anim.gif', 'imagemagick')