В следующем коде (отредактированном для выполнения исполняемого файла) я отображаю расположение объектов (
Код: Выделить всё
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)
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, поэтому я остановился на самом близком варианте, и это помогло сделать первый запуск успешным.
Подробнее здесь: https://stackoverflow.com/questions/785 ... runs-until