python - 在 Python 中使用 "Disappearing Tail"动画化粒子路径

标签 python animation matplotlib

我正在尝试为 2d 路径制作动画,我希望它有一种“消失的尾部”,在任何给定时间,它只显示最后 5 个(例如)粒子。

我目前拥有的与此相去甚远:

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

sample_path = np.random.uniform(size=(100,2))

fig, ax = plt.subplots()

x = np.arange(-1, 1, 0.01)        # x-array
line, = ax.plot(sample_path[0,0], sample_path[0,1])

def connect(i):
    (x0,y0) = sample_path[i-1,:]
    (x1,y1) = sample_path[i,:]
    plt.plot([x0,x1],[y0,y1],'ro-')
    return line,

def init():
    line.set_ydata(np.ma.array(x, mask=True))
    return line,

ani = animation.FuncAnimation(fig, connect, np.arange(1, 100), init_func=init,
interval=200, blit=True)
HTML(ani.to_html5_video())

这保留了“完整的尾部”,即在 k 步之后,它显示了所有前 k 个位置。

有没有办法调整我所拥有的,以便动画只显示粒子的最新历史?

最佳答案

您可能希望更新线条而不是向绘图添加大量新点。选择最近的 5 个点可以通过索引来完成,例如

sample_path[i-5:i, 0]

完整示例,我们注意不要有负索引,也不使用 blit(如果保存动画则没有意义)。

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

r = np.sin(np.linspace(0,3.14,100))
t = np.linspace(0, 10, 100)
sample_path = np.c_[r*(np.sin(t)+np.cos(t)), r*(np.cos(t)-np.sin(t))]/1.5

fig, ax = plt.subplots()

line, = ax.plot(sample_path[0,0], sample_path[0,1], "ro-")

def connect(i):
    start=max((i-5,0))
    line.set_data(sample_path[start:i,0],sample_path[start:i,1])
    return line,

ax.set_xlim(-1,1)
ax.set_ylim(-1,1)
ani = animation.FuncAnimation(fig, connect, np.arange(1, 100), interval=200)
plt.show()

enter image description here

关于python - 在 Python 中使用 "Disappearing Tail"动画化粒子路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49119896/

相关文章:

python - pyplot 放大

python - 如何使用一种方法通过某个值更新一个对象的不同集合?

应用缩放变换时的 ios 生涩动画

iOS 核心动画 : Show and hide effect

java - float 操作按钮上的淡入淡出动画

python 和 matplotlib 中的更新图

python - 在 matplotlib 中显示毫秒

python - 将 Airflow 用于频繁的任务

python - 在命令行应用程序中打印标准输出而不覆盖待处理的用户输入

python - API POST-Request 适用于 PowerShell,但不适用于 Python