Как отобразить только текущий кадр с анимацией.FuncAnimation?

#python #python-3.x #matplotlib #jupyter-notebook

#python #python-3.x #matplotlib #jupyter-ноутбук

Вопрос:

Генерация данных:

 import glob
import pandas as pd
import numpy as np

coords = dict()
for j in range(10):
    x=np.random.uniform(0.0, 5.0,2);
    y=np.random.uniform(0.0, 5.0,2);
    vx=np.random.uniform(-1,1,2);
    vy=np.random.uniform(-1,1,2);
    coords[j]= {'x': x, 'y':y, 'vx':vx, 'vy':vy}
  

Часть построения графика:

 import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
from matplotlib import animation, rc
from IPython.display import HTML
%matplotlib inline

fig, ax = plt.subplots(1,1)


ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)

def update_quiver(frameIdx):
    global coords
    frame = coords[frameIdx]
    X = frame['x']
    Y = frame['y']
    U = frame['vx']
    V = frame['vy']
    Q = ax.quiver(X, Y, U, V, pivot='mid', color='k', units='inches')

    Q.set_UVC(U,V)
    return Q,
  

И затем построение:

 rc('animation', html='jshtml')
anim = animation.FuncAnimation(fig, update_quiver, fargs=(),
                               interval=50, blit=False, frames=max(coords.keys()))
anim
  

введите описание изображения здесь

Как я могу визуализировать только текущее местоположение частиц, а не всю траекторию?

Когда я пытаюсь:

 def update_quiver(frameIdx):
    global coords
    fig.clf()
    ax.set_xlim(-5, 5)
    ax.set_ylim(-5, 5)
    frame = coords[frameIdx]
    X = frame['x']
    Y = frame['y']
    U = frame['vx']
    V = frame['vy']
    Q = ax.quiver(X, Y, U, V, pivot='mid', color='k', units='inches')


    Q.set_UVC(U,V)
    return Q,
  

Он ничего не показывает.

Ответ №1:

Вариант удаления quiver, о котором я говорил, может выглядеть следующим образом:

 import numpy as np; np.random.seed(1)

coords = dict()
for j in range(10):
    x=np.random.uniform(0.0, 5.0,2);
    y=np.random.uniform(0.0, 5.0,2);
    vx=np.random.uniform(-1,1,2);
    vy=np.random.uniform(-1,1,2);
    coords[j]= {'x': x, 'y':y, 'vx':vx, 'vy':vy}

import numpy as np
from matplotlib import pyplot as plt, animation

fig, ax = plt.subplots(1,1)

ax.set_xlim(-1, 6)
ax.set_ylim(-1, 6)

Q = ax.quiver(1,1,1,1, alpha=0)

def update_quiver(frameIdx):
    global coords, Q
    frame = coords[frameIdx]
    X = frame['x']
    Y = frame['y']
    U = frame['vx']
    V = frame['vy']
    Q.remove()
    Q = ax.quiver(X, Y, U, V, pivot='mid', color='k', units='inches')
    return Q,


anim = animation.FuncAnimation(fig, update_quiver, fargs=(),
                               interval=500, blit=False, frames=max(coords.keys()))

plt.show()
  

Ответ №2:

Вы можете попробовать очистить рисунок в update_quiver :

 fig.clf()
  

РЕДАКТИРОВАТЬ: этот код работает на моем компьютере:

 def update_quiver(frameIdx):
    frame = coords[frameIdx]

    plt.cla()
    ax.set_xlim(-1, 7)
    ax.set_ylim(-1, 7)

    X = frame['x']
    Y = frame['y']
    U = frame['vx']
    V = frame['vy']
    Q = ax.quiver(X, Y, U, V, pivot='mid', color='k', units='inches')

    Q.set_UVC(U,V)
    return Q,

anim = animation.FuncAnimation(fig, update_quiver, fargs=(),interval=500, blit=True,frames=np.arange(len(coords)))
fig.tight_layout()
plt.show()

  

Комментарии:

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

2. Я попробовал и заставил его работать с plt.cla() in update_quiver , как упоминал ImportanceOfBeingErnes, однако вам нужно снова установить ylim и xlim после очистки осей.

3. это не добавило его к моим вопросам

4. Я опубликовал код, который корректно работает на моем компьютере и рисует две стрелки в каждом кадре.