这是我编写的用于在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
没有被明智地使用。
答案 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,
你计算的每个点都是由另一个人预先占据的。因此它似乎是静态的。如果您想查看中间步骤,则需要更新数据生成(尤其是去掉模数)。或者扩展边界/图形限制,这样就可以看到点移动了。