Я пытаюсь анимировать анимацию столкновения частиц в одном объекте оси, одновременно рисуя некоторые данные в другом объекте оси (используя matplotlib.gridspe c). Я создал тестовую среду с тестовыми данными, упрощая столкновение до появления кругов по осям 1 (объекты matplotlib.patches.Circle) и нанося на экран функцию синуса по осям 2 (объект matplotlib.lines.Line2D). Анимация работает одновременно для одной оси, но я не могу запустить анимацию обеих осей одновременно.
Я думаю, что проблема связана с возвращаемыми объектами в функциях init () и animate (i). Объекты "matplotlib.patches" и "matplotlib.lines" имеют проблемы в сочетании с анимацией, но я не могу понять, почему. Вот мой код:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
from matplotlib.animation import FuncAnimation
from matplotlib.gridspec import GridSpec
#%% setup test data
xy = (0.5, 0.5)
r = 0.02
i = np.arange(10,110)
#%% setup figure
fig = plt.figure(figsize = (8,8))
gs = GridSpec(6,4, figure=fig, wspace=0, hspace=0)
ax0 = fig.add_subplot(gs[0:4,0:4])
ax1 = fig.add_subplot(gs[5:6,0:4])
ax1.set_xlim(0,100)
# assigning labels
circles = []
ln1, = ax1.plot([],[], 'r')
def init():
ln1.set_data([],[])
circles = []
return circles, ln1
def animate(i):
xy = (np.random.random(), np.random.random())
circles.append(ax0.add_patch(Circle(xy,r)))
x = np.linspace(0,100,100)
y = np.sin(x)
mask1 = x < i
x1 = x[mask1]
y1 = y[mask1]
ln1.set_data(x1, y1)
return circles, ln1
ani = FuncAnimation(fig, animate, init_func=init, frames = i, blit=True, interval = 1)
plt.show()
Это сообщение об ошибке, которое я получаю:
Traceback (most recent call last):
File "C:\Users\flofr\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py", line 216, in process
func(*args, **kwargs)
File "C:\Users\flofr\anaconda3\lib\site-packages\matplotlib\animation.py", line 953, in _start
self._init_draw()
File "C:\Users\flofr\anaconda3\lib\site-packages\matplotlib\animation.py", line 1741, in _init_draw
a.set_animated(self._blit)
AttributeError: 'list' object has no attribute 'set_animated'
Traceback (most recent call last):
File "C:\Users\flofr\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py", line 216, in process
func(*args, **kwargs)
File "C:\Users\flofr\anaconda3\lib\site-packages\matplotlib\animation.py", line 1269, in _handle_resize
self._init_draw()
File "C:\Users\flofr\anaconda3\lib\site-packages\matplotlib\animation.py", line 1741, in _init_draw
a.set_animated(self._blit)
AttributeError: 'list' object has no attribute 'set_animated'
Я попытался проверить, верны ли возвращаемые значения для init (), и похоже, что регистр.
Вход:
def init():
ln1.set_data([],[])
circles = []
circles.append(ax0.add_patch(Circle(xy,r)))
return ln1, circles
a, b = init()
print(a)
print(b)
Выход:
Line2D(_line0)
[<matplotlib.patches.Circle object at 0x000001E7DE16F548>]
Вот три состояния моделирование. Изображение 1 показывает макет, изображение двух моделирование осей 1 (круги) и изображение трех моделирование осей 2 (синус).