Анимация столкновения частиц Python - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь анимировать анимацию столкновения частиц в одном объекте оси, одновременно рисуя некоторые данные в другом объекте оси (используя 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 (синус).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...