#python #matplotlib
Вопрос:
У меня возникли некоторые проблемы с документацией Matplotlib по анимации гистограмм. Документ находится здесь: https://matplotlib.org/stable/gallery/animation/animated_histogram.html
Я хочу сгруппировать свои данные по каждому месяцу года и отобразить свои значения за этот месяц в виде гистограммы. В данный момент я перебираю свои df
, беру значения за каждый месяц и строю их в виде гистограммы. Как показано здесь:
for i in months:
temp = df.loc[df['month_number'] == i]
plt.hist(temp['values'], density=False, bins=30)
plt.show()
Пытаясь следовать этому, мой код таков:
# Fixing bin edges to be between -5 and 5
HIST_BINS = np.linspace(-5, 5, 30)
# histogram our data with numpy
data = df['values']
n, _ = np.histogram(data, HIST_BINS)
Все вышесказанное кажется мне прекрасным. Проблема в том, чтобы понять и изменить следующую часть. Вот где я нахожусь, что может быть далеко не правильно. Я не совсем уверен, как использовать эти замыкания python, и в данный момент изучаю их из-за этой задачи. Любые рекомендации приветствуются.
def prepare_animation(bar_container):
def animate(HIST_BINS,data,n,_,frame_number):
for count, rect in zip(n, bar_container.patches):
rect.set_height(count)
return bar_container.patches
return animate()
fig, ax = plt.subplots()
a, b, bar_container = ax.hist(data, HIST_BINS, lw=1,ec="red", fc="blue", alpha=0.5)
ax.set_ylim(top=140)
ani = animation.FuncAnimation(fig, prepare_animation(bar_container), 50,
repeat=False, blit=True)
HTML(ani.to_html5_video())
TypeError: animate() missing 5 required positional arguments: 'HIST_BINS', 'data', 'n', '_', and 'frame_number'
Любая помощь в изменении этого кода будет весьма признательна.
Ответ №1:
Я последовал примеру, приведенному в вашем вопросе, и изменил ваш код. Я сам ничего не знаю о закрытиях, но ошибка была в аргументе. Ошибка не возникает с аргументами, как показано в примере. В вашем вопросе нет примера данных, поэтому я создал фрейм данных с соответствующими номерами для временного ряда за 1 год, а затем создал столбец значений месяца из временного ряда и использовал его для создания данных, указав месяц в процессе анимированного цикла.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
np.random.seed(20211025)
df = pd.DataFrame({'date': pd.date_range('2020-01-01','2021-01-01',freq='1d'), 'values':np.random.randn(367)})
df['date'] = pd.to_datetime(df['date'])
df['month'] = df['date'].dt.month
months = ['January','February','March','April','May','June','July','August','September','October','November','December']
# Fixing bin edges to be between -5 and 5
HIST_BINS = np.linspace(-5, 5, 30)
# histogram our data with numpy
data = np.random.randn(1000)
n, _ = np.histogram(data, HIST_BINS)
def prepare_animation(bar_container):
def animate(frame_number): # HIST_BINS,data,n,_,
#data = np.random.randn(1000)
#print(frame_number)
m = frame_number 1
ax.set_title("{}".format(months[frame_number]))
data = df.query('month == @m')
n, _ = np.histogram(data['values'], HIST_BINS)
for count, rect in zip(n, bar_container.patches):
rect.set_height(count)
return bar_container.patches
return animate
fig, ax = plt.subplots()
a, b, bar_container = ax.hist(data, HIST_BINS, lw=1, ec="red", fc="blue", alpha=0.5)
ax.set_ylim(top=20)
# plt.show()
ani = animation.FuncAnimation(fig, prepare_animation(bar_container), 12, repeat=False, blit=True, interval=500)
HTML(ani.to_html5_video())
Комментарии:
1. Большое вам спасибо за ваше руководство. Я передавал аргументы там, где, похоже, не должно было передаваться никаких аргументов. Спасибо.