2015-03-08 3 views
2

В настоящее время _draw_frame функция моей пользовательских анимации класса делает это:matplotlib: как я могу «создать» анимацию?

  1. Возвращает строку данных для временного шага n
  2. обновление данных каждой линии, представляющей интерес в осях с set_data (позволяет сказать, что для примера (ax_line1.set_data(datax, datay, где ax_line1, = ax.plot(...))
  3. составить список каждой строки, которая была обновлена, и установить self._drawn_artists в том, что (так что в примере, если две линии интерес есть, то мы обновляем их self._drawn_artists = [ax_line1, ax_line2]

Есть ли способ, которым я могу установить данные в нескольких экземплярах художников линии до того, как вызывается _draw_frame? Затем все, что требуется _draw_frame, - это выборка выстроенных строк и обновление списка рисованных исполнителей.

Это значит, что я установил данные художника параллельно, если у меня уже есть данные и, таким образом, вы получите анимацию быстрее? Я пытался сделать copy.deepcopy художников, но получил сообщение об ошибке, что я не могу этого сделать (TransformationNode должен быть заморожен). Какие у меня есть другие варианты?

+0

Просто убедитесь, что я правильно понимаю вас - вы говорите, что в основном хотите создать кучу объектов линии перед тем, как начать анимацию, а затем передать список из них в _draw_frame, чтобы указать, какие из них следует добавить в данный кадр? Вам когда-нибудь нужно переводить линии? Вы используете blitting? – seaotternerd

+0

Да, вы меня правильно поняли.Мне нужно было бы разузнать эти строки для следующего кадра, я полагаю, но я предполагаю, что это происходит где-то, на что я сейчас не трогаю. Я не использую бьющий, потому что я не знаю достаточно об этом. – user89

ответ

1

Если вы хотите установить данные параллельно, я думаю, что ваш лучший вариант - просто создать все объекты линии, которые вам понадобятся, вызывая много раз конструктор. Затем вы можете перебирать их и устанавливать данные по мере необходимости. Если многие ваши линии должны быть одинаковыми атрибутами, вы можете добиться этого с помощью метода художников matplotlib update_from. Вы могли бы указать freeze некоторые объекты линии, чтобы они могли быть скопированы, но тогда вы не сможете изменить данные.

Это, если вы считаете, что вам также понадобится переводить линии, я не уверен, сколько времени это спасет вас. Если у вас есть огромное количество данных, которые вы можете обрабатывать в очень параллельном режиме, то это может стоить того.

Тем не менее, если вы действительно хотите ускорить это, вы, вероятно, должны использовать бьющий. Основная идея blitting заключается в следующем:

  • Начните с рисования любых элементов фона, которые будут присутствовать во всех кадрах.
  • Всех остальные элементы анимации представлены в виде рисуемых объектов некоторого рода (которые lines удобно являются)
  • Для каждого кадра, вы обновляете атрибуты вашего вводимого коэффициента, что вам нужно. Затем вы возвращаете список всего, из которого вы изменили атрибут.
  • Функция Matplotlib's FuncAnimation управляет остальными с потрясающей эффективностью.

Поскольку все ваши операции связаны с обновлением линий, это довольно идеальный сценарий, в котором можно использовать блиты. Документация Matplotlib о blitting не невероятно ясна, поэтому, если вы хотите более подробно, я написал this tutorial, в котором есть пример кода и т. Д.

+0

Возможно, вы уже заметили, что ссылка на [Blitting Tutorial] больше не работает. Возможно, вам захочется любезно обновить сообщение с обновленного URL-адреса или восстановить неработающую ссылку другим способом. Большое спасибо. – user3666197

+1

О, спасибо, что поймали это. Это фиксированная! – seaotternerd

+1

Большое спасибо за такую ​​помощь, в настоящее время опытные headbangs на эффективные и быстрые обновления векторной сцены, поэтому такая полезная рука более ценится. Желаю вам бесконечного потока творчества и безграничных искры вдохновения для ваших текущих и будущих программ R & D. – user3666197

Смежные вопросы