WedX - журнал о программировании и компьютерных науках

Как одновременно анимировать несколько элементов (matshow и line) с помощью matplotlib?

Я пытаюсь понять, как анимировать несколько элементов на одной оси с помощью matplotlib. Я могу сделать это с помощью отдельных элементов (линии или изображения из matshow), выполнив следующие действия: https://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/, но расширение до 2 элементов, похоже, не работает.

Я видел несколько других подобных вопросов о stackoverflow, но, похоже, у меня возникла другая проблема.

Вот код, который я пробовал:

    fig = plt.figure()
    ax = plt.axes(xlim=[-0.5, np.shape(first_cadence)[0]-0.5], ylim=[-0.5, np.shape(first_cadence)[1]+0.5])

    im = ax.matshow(first_cadence, animated=True)
    line_pos = ax.plot(x[0], y[0], '*')

    def initiate():
        im.set_array(f[0,'FLUX'])
        line_pos.set_data([], [])
        return (im, line_pos)

    def update(i):
        im.set_array(f[i,'FLUX'])
        line_pos.set_data([x[i]], [y[i]])
        return (im, line_pos)

    ani = animation.FuncAnimation(fig, update, range(0, len(f)), init_func=initiate, interval=50, blit=True)

    plt.show()

Я получаю длинное сообщение об ошибке, заканчивающееся словами:

AttributeError: 'list' object has no attribute 'set_data'

Могу выложить все, если нужно. Для получения дополнительной информации, x и y — это просто одномерные массивы, поэтому я рисую одну точку в каждом кадре, а не линию. То есть: x = [1.21, 1.20, 1.19, 1.23, ...]

Так что я не знаю, что происходит не так. Я предполагаю, что это что-то с тем, как я возвращаю элементы с функциями инициации и обновления. Я подумал, что, поскольку вы должны вернуть кортеж с версией с одним элементом (т.е. return line,), то простой способ расширить это на несколько элементов будет с кортежем, содержащим все элементы. Но это было только предположение.


Ответы:


1

Обратите внимание, что в этом руководстве при установке line есть запятая, которую вы пропустили при установке line_pos.

Сравнивать:

line, = ax.plot([], [], lw=2)

с:

line_pos = ax.plot(x[0], y[0], '*')

Это источник вашей ошибки. Когда вы вызываете ax.plot, он возвращает список всех созданных объектов Line2D.

Примечание. Он возвращает список, потому что .plot может создавать более одной строки одновременно, например. ax.plot(x1, y1, x2, y2, x3, y3) создаст три объекта line2D.

В вашем случае создается только одна строка, поэтому вы можете просто добавить запятую после line_pos, чтобы распаковать этот список из одного элемента, и оставить только тот объект Line2D, который вам нужен.

то есть вы должны изменить

line_pos = ax.plot(x[0], y[0], '*')

to

line_pos, = ax.plot(x[0], y[0], '*')
09.08.2017
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]