我刚刚开始一个小粒子模拟器,我希望扩展以解决一些物理问题,但我试图动画它们时遇到问题。基本上取决于您选择的随机分布类型,粒子将在给定长度的区域内“振荡”。我想在之前的10个步骤中显示粒子的“历史”。
这是代码
from numpy import *
import matplotlib.pyplot as plt
import pylab
import time
pylab.ion()
N = 10
r = random.randint(-100,100,2*N).reshape(N,2)
line, = plt.plot(r[:,0], r[:,1],'o')
for i in range(100000):
newdatax = r[:,0] + random.rand(N)
newdatay = r[:,1] + random.rand(N)
line.set_ydata(newdatay)
line.set_xdata(newdatax)
plt.title("At timestep: %d" %i)
plt.hold(True)
plt.draw()
time.sleep(1.0/30)
我想要的是线更新不清除画布并在每次迭代时重绘,我只是希望它这样做,例如,每10帧(迭代),这将使我更容易跟踪粒子视觉。
我希望实现另一件事,但并非绝对必要,是否可以在每个“o”周围画一个方框(方形)或圆形或三角形?这样的点是以盒子/圆圈/三角形为中心的?这将再次使跟踪粒子更容易。如果我可以指示哪个“o”(点)得到这个属性(正方形),那就更好了。
答案 0 :(得分:2)
试试animation
module。另请参阅此令人敬畏的tutorial,Matplotlib animate over an image(主要是我对Animate drawing networkx edges的答复的副本和过去)
要获得所需的时间延迟,您需要设置历史数据结构,例如:
from matplotlib import animation
fig = figure()
N = 10
r = random.randint(-100,100,2*N).reshape(N,2)
line, = plt.plot(r[:,0], r[:,1],'o')
lag_len = 10
history_x = np.zeros((N,lag_len))
history_y = np.zeros((N,lag_len))
trails = [plot(hx,hy)[0] for hx,hy in zip(history_x,history_y)]
def update_frame(i):
frame_num = i
newdatax = r[:,0] + random.rand(N)
newdatay = r[:,1] + random.rand(N)
line.set_ydata(newdatay)
line.set_xdata(newdatax)
history_x[:,frame_num%lag_len] = newdatax
history_y[:,frame_num%lag_len] = newdatay
for hx,hy,ln_h in zip(history_x,history_y,trails):
ln_h.set_xdata(hx)
ln_h.set_ydata(hy)
plt.title("At timestep: %d" %i)
plt.hold(True)
return (line,) + tuple(trails)
anim = animation.FuncAnimation(fig, update_frame,
frames=100, interval=20)
至于方框,请使用Rectangle(Draw rectangle (add_patch) in pylab mode),并将可选参数传递给FuncAnimation
。
这不是完美的,有一些奇怪的细节循环回到它的自身(一个循环中的帧50与下一次经过的帧50不同),前10帧有一个瞬态当历史记录中有一堆零时(您可以通过将历史数组初始化为初始点的10个副本来解决这个问题)