matplotlib: анимация штрихового графика работает только один раз - PullRequest
2 голосов
/ 04 августа 2020

Я реализовал анимацию, используя FuncAnimation метод matplotlib.animation.

В коде нет ошибки, но я не знаю, в чем проблема на самом деле!

Код:

def visualization(self):
    fig = plt.figure()
    
    def animation_frame(i):
        print(i)
        trimmed_dist = self.get_distributions(i, self.window_size + i)
        # create labels             
        label_no = len(trimmed_dist)
        labels = []
        for index in range(label_no):
            from_ = index * self.bucket_length
            to_ = (index + 1) * self.bucket_length
            label = '{:.2f} - {:.2f}'.format(from_, to_)
            labels.append(label)
        
        #create bar chart
        colors = plt.cm.Dark2(range(label_no))
        plt.xticks(rotation=90)
        plt.bar(x=labels, height=trimmed_dist, color=colors)
        
    frames_no = len(self.percentages) - self.window_size
    print('frames_no:', frames_no)
    animation = FuncAnimation(fig, animation_frame, frames=frames_no, interval=1000)
    return animation

Вывод:

выходное изображение matplotlib

PS 1: Значение frame_no равно 877.

PS 2: Думаю, проблема в возврате в метод визуализации. Я изменил код, но он по-прежнему не работает.

1 Ответ

1 голос
/ 05 августа 2020

Я полагаю, вы запускаете свой код в записной книжке Jupyter. В этом случае вы должны добавить %matplotlib notebook в начале вашего кода. В качестве справки попробуйте запустить код, который вы можете найти в этом ответе , чтобы проверить, работает ли он для вас.

EDIT

Я реализовал часть вашего кода в записной книжке. Поскольку я не знаю, что такое self.percentages, self.window_size, self.get_distributions и self.bucket_length и какие у них значения, я установил labels = ['a', 'b', 'c'] и trimmed_dist = [3*i, 2*i, i**2] для простоты, чтобы запустить простую анимацию. Это мой код:

%matplotlib notebook
from matplotlib.animation import FuncAnimation
import matplotlib.pyplot as plt

def animation_frame(i):
    plt.gca().cla()
    
    labels = ['a', 'b', 'c']
    trimmed_dist = [3*i, 2*i, i**2]
    label_no = len(trimmed_dist)
    
    colors = plt.cm.Dark2(range(label_no))
    plt.xticks(rotation=90)
    plt.bar(x=labels, height=trimmed_dist, color=colors)
    plt.title(f'i = {i}') # this replaces print(i)
    plt.ylim([0, 100])    # only for clarity purpose

fig = plt.figure()
frames_no = 877
print('frames_no:', frames_no)
animation = FuncAnimation(fig, animation_frame, frames=frames_no, interval=1000)

И это результат.

Я добавил plt.gca().cla(), чтобы стирать предыдущий кадр на каждой итерации. Оператор print(i) у меня тоже не работает, поэтому я заменяю его на plt.title(f'i = {i}'), чтобы написать i в заголовке. Напротив, print('frames_no:', frames_no) работает правильно.

Как видите, моя анимация работает, поэтому попробуйте реализовать изменения, которые я внес в ваш код. Если анимация по-прежнему не запускается, попробуйте проверить значения и типы self.percentages, self.window_size, self.get_distributions и self.bucket_length, чтобы убедиться, что labels и trimmed_dist вычисляются правильно.

...