Сценарий анимации Matplotlib работает нормально в первый раз, но зависает при повторных запусках, пока ядро ​​не будет пPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Сценарий анимации Matplotlib работает нормально в первый раз, но зависает при повторных запусках, пока ядро ​​не будет п

Сообщение Anonymous »

Я пытаюсь запустить анимацию, в которой диаграмма рассеяния обновляется каждый временной интервал. Я работаю в блокноте Jupyter в vscode (если применимо). Сценарий анимации, приведенный ниже, отлично работает с первого раза, но при последующих запусках он выполняется не так, как предполагалось. Проблема устраняется только при перезапуске ядра. Моя работа требует от меня постоянного изменения этого кода анимации и, следовательно, необходимости запускать его несколько раз. Каждый раз перезапускать ядро ​​затруднительно.
В следующем коде (отредактированном для выполнения исполняемого файла) я отображаю расположение объектов (

Код: Выделить всё

block_centroids
) с использованием диаграммы рассеяния и их обновления с использованием смещений в моменты времени (задаваемые полями).

Код: Выделить всё

import numpy as np
import matplotlib
%matplotlib ipympl
%matplotlib widget
import matplotlib.pyplot as plt
from matplotlib import animation

# Toy example

timepoints = np.arange(0,1,0.02)    # 100 frames

xs = np.arange(1,11)
ys = np.arange(1,11)
block_centroids = np.dstack(np.meshgrid(xs, ys)).reshape(-1, 2)
# (N, 2) initial location array for N = 100 objects

rand_amp = np.random.rand(100, 2)/10
fields = [rand_amp * np.sin(i/(20*np.pi)) for i in range(len(timepoints))]
# sinusoidal displacements for each object with random amplitudes

fig, axes = plt.subplots(figsize=(9,5), tight_layout = True)

scat = axes.scatter(xs, ys)
axes.set_aspect('equal', adjustable='box')

def update(val):
if val == len(timepoints) - 1:
print('closing!')
exit()

scat.set_offsets(block_centroids + fields[val])
fig.suptitle(fr'time $t = {timepoints[val]:.2f}$s')
fig.canvas.draw_idle()
return scat

def init():
pass

ani = animation.FuncAnimation(fig=fig, func=update, init_func=init, frames=len(timepoints), blit = True, interval=100)
После первого запуска этого блока кода повторный запуск либо зависает на каком-то промежутке времени (между 0 и 1), и преждевременно печатает 'closing!'
Strong>, или код продолжает выполняться вечно, без вывода данных и без ошибок, пока я не попытаюсь его остановить и время ожидания ядра не истечет.
Я пробовал несколько вещей, не совсем понимая, почему они могут работа. Я предполагаю, что объекты, связанные с анимацией, не сбрасываются, и каким-то образом функция update() вызывается с неправильным (старым) значением, и мои попытки в основном пытались закрыть/удалить старые экземпляры.
  • Я добавил оператор if внутри функции update(), чтобы попытаться закрыть анимацию после запуска. Ранее вместо функции exit() я использовал plt.close(fig), что приводило к зависанию анимации на полпути и выводу 'closing!'. > вывод повторяется.
  • Я пробовал добавить plt.cla(), plt.clf() и plt .close() в начале блока кода, чтобы закрыть все открытые экземпляры fig и axes, но это не помогло.
  • Я попытался удалить объекты fig и ani с помощью команды del, чтобы удалить их предыдущие экземпляры, в надежде начать заново при каждом запуске, но это не сработало. p>

    Раньше даже при первых запусках анимации были проблемы. Я добавил бэкэнд Agg после прочтения ответа на stackoverflow, в котором рекомендовал GTKAgg для лучшей обработки анимации. Я не мог использовать GTKAgg, потому что у меня нет cairo, поэтому я остановился на самом близком варианте, и это помогло сделать первый запуск успешным.
Что здесь работает не так, как задумано? Что я могу попытаться отладить? Я пробовал печатать val при каждом вызове функции, чтобы проверить, что происходит во время повторов, но затем код продолжал работать без каких-либо выходных данных.

Подробнее здесь: https://stackoverflow.com/questions/785 ... runs-until
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»