Анимация гистограмм с помощью запроса Matplotlib

#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. Большое вам спасибо за ваше руководство. Я передавал аргументы там, где, похоже, не должно было передаваться никаких аргументов. Спасибо.