python中的多体动画返回静态图片

时间:2016-04-22 14:46:11

标签: python animation matplotlib

这是我编写的用于在matplotlib中制作动画的程序。该程序涉及最初以六边形格子排列的18​​个颗粒的系统。初始配置在simPoints(simData)的定义下给出。

系统根据规则x[i]=x[i]+L/2.0在x和y方向上随时间演变。走出窗外的颗粒通过另一侧进入。这些更新在函数simData()下提及。

但是我从这段代码中得到的只是粒子初始配置的静态图片。

from numpy import*
import matplotlib.pyplot as plt
import matplotlib.animation as animation

L=1         # lattice constant = sigma*2**0.5 (Let)

x=zeros(18,float)
y=zeros(18,float)


#~~~~~~~~~~~~~~~~~ ANIMATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def simData():
    t = 1
    while t<=20:
        for i in range(18):
            x[i]=x[i]+L/2.0
            y[i]=y[i]+L/2.0
            if x[i]>L*3:                    # translate back the particle if it goes out of window limit 0 to L*cell
                x[i]=x[i]-L*3
            elif x[i]<0:
                x[i]=L*3-x[i]
            if y[i]>L*3:                    # translate back the particle if it goes out of window limit 0 to L*cell
                y[i]=y[i]-L*3
            elif y[i]<0:
                y[i]=L*3-y[i]
        t=t+1
    yield x, y

def simPoints(simData):
    k=0
    for i in range(0,6,1):
        for j in range(0,6,1):
            if (i+j)%2==0:
                x[k]=i*L*.5+.25*L
                y[k]=j*L*.5+.25*L
                k=k+1
    line.set_data(x, y)
    return line,

fig = plt.figure()
ax = fig.add_subplot(111)

line, = ax.plot(x, y,'bo', ms=8)
ax.set_ylim(0, L*3)
ax.set_xlim(0, L*3)
ani = animation.FuncAnimation(fig, simPoints, simData, blit=False, interval=100)

plt.show()

我如何为格子设置动画?我有一种感觉,论据interval=100没有被明智地使用。

2 个答案:

答案 0 :(得分:1)

我在您的代码中做了一些小的更改,如下所示。它现在正在动画,但是simPoints()被注释掉了。主要问题是如果你初始化这样的点,在每一步之后它们最终会在相同的位置。点移动,但另一个点取代他们的位置,所以看起来情节不动。您可能想要更改simData()函数,例如使更改更加微妙或随机,以避免这种情况。

from numpy import*
import matplotlib.pyplot as plt
import matplotlib.animation as animation

L=1         # lattice constant = sigma*2**0.5 (Let)

x=array([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.1,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18])
#x=zeros(18,float)
y=zeros(18,float)

#~~~~~~~~~~~~~~~~~ ANIMATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def simData():
    t = 1
    while t<=20:
        for i in range(18):
            x[i]=x[i]+L/2.0
            y[i]=y[i]+L/2.0
            if x[i]>L*3:                    # translate back the particle if it goes out of window limit 0 to L*cell
                x[i]=x[i]-L*3
            elif x[i]<0:
                x[i]=L*3-x[i]
            if y[i]>L*3:                    # translate back the particle if it goes out of window limit 0 to L*cell
                y[i]=y[i]-L*3
            elif y[i]<0:
                y[i]=L*3-y[i]
        t=t+1

def simPoints():
    k=0
    for i in range(0,6,1):
        for j in range(0,6,1):
            if (i+j)%2==0:
                x[k]=i*L*.5+.25*L
                y[k]=j*L*.5+.25*L
                k=k+1

fig = plt.figure()
ax = plt.axes()
#simPoints()
line, = ax.plot(x, y,'bo', ms=8)
ax.set_ylim(0, L*3)
ax.set_xlim(0, L*3)

def animate(i):
    simData()
    print x
    line.set_data(x, y)
    return line,

ani = animation.FuncAnimation(fig, animate, blit=False, interval=100, frames=200)

plt.show()

答案 1 :(得分:1)

动画很好,很有效。你的问题是你逻辑中的对称性。要测试动画,只需添加一些随机值:

def simPoints(simData):
    k=0
    for i in range(0,6,1):
        for j in range(0,6,1):
            if (i+j)%2==0:
                # just add some randomness to see the random x-movement
                x[k]=i*L*.5+.25*L + random.random(1)
                y[k]=j*L*.5+.25*L
                k=k+1
    line.set_data(x, y)
    return line,

你计算的每个点都是由另一个人预先占据的。因此它似乎是静态的。如果您想查看中间步骤,则需要更新数据生成(尤其是去掉模数)。或者扩展边界/图形限制,这样就可以看到点移动了。