使用Matplotlib在Python中动画兰登的Ant

时间:2014-04-13 12:01:57

标签: python animation matplotlib

在Project Euler上做了一些问题,我遇到了Langdon's Ant,并认为尝试用Python编写动画代码是个不错的主意。作为基础,我去使用了matplotlib函数动画,在这篇文章中可以看到一个很好的例子here

我设法让版本正常工作,代码如下所示。我们的想法是模拟蚂蚁用大矩阵移动的黑白网格,然后使用' imshow'来绘制该矩阵。

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

# Initialize the Simulation

dim=50
a=np.matrix(np.zeros((dim,dim)))
pos=np.matrix([[dim//2],[dim//2]]) # current position of ant
direction=np.matrix([[1],[0]])  # direction ant is currently moving

#Rotation Matrices 
clock=np.matrix([[0,1],[-1,0]])
counter=np.matrix([[0,-1],[1,0]])

def takestep(a,pos,direction):
    pos[:]=pos+direction       
    if a[pos[0,0],pos[1,0]]==0: #landed on white
        a[pos[0,0],pos[1,0]]=1
        direction[:]=clock*direction
    else:        
        a[pos[0,0],pos[1,0]]=0
        direction[:]=counter*direction

#Plotting    
fig = plt.figure()        
im=plt.imshow(a,interpolation='none')  

def init():
    im=plt.imshow(a,interpolation='none')
    return [im]

def animate(i):
    takestep(a,pos,direction)
    im=plt.imshow(a,interpolation='none')
    #im.set_data(np.array(a))        
    return [im]


anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=200, interval=0, blit=True)

此代码功能正常,但我不清楚某些事情:

  • 动画连续运行(直到蚂蚁超出界限)和 在200帧之后不会重置

  • 即使间隔设置为0,动画运行速度也很慢,每秒更新两次

  • 我想我可以通过使用im.set_data()函数(在代码中注释掉)加快速度,在我的实现中,这不起作用(不变的可视化)

    < / LI>

如果有人能给我一些关于如何改进这个动画的指示,那将是非常好的,谢谢!

祝你好运, 圣拉斐尔

1 个答案:

答案 0 :(得分:1)

以下是使用im.set_data来提高帧数/秒的方法。

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

# Initialize the Simulation

dim = 50
a = np.matrix(np.zeros((dim, dim)))
pos = np.matrix([[dim // 2], [dim // 2]])  # current position of ant
direction = np.matrix([[1], [0]])  # direction ant is currently moving

# Rotation Matrices
clock = np.matrix([[0, 1], [-1, 0]])
counter = np.matrix([[0, -1], [1, 0]])


def takestep(a, pos, direction):
    pos[:] = pos + direction
    if a[pos[0, 0], pos[1, 0]] == 0:  # landed on white
        a[pos[0, 0], pos[1, 0]] = 1
        direction[:] = clock * direction
    else:
        a[pos[0, 0], pos[1, 0]] = 0
        direction[:] = counter * direction

fig = plt.figure()
im = plt.imshow(a, interpolation='none', vmin=0, vmax=1)

def animate(i):
    takestep(a, pos, direction)
    im.set_data(a)
    return [im]


anim = animation.FuncAnimation(fig, animate,
                               frames=200, interval=0, blit=True,
                               repeat=False)
plt.show()

  • 使用repeat=False在200帧后停止动画。
  • vmin=0, vmax=1的初始通话中设置imshow。对plt.imshow的初始调用设置vminvmax,它们控制值和颜色之间的对应关系。该设置用于imshow AxesImage的所有后续渲染。由于初始plt.imshow使用全零数据,vminvmax都设置为0(初始数据的最小值和最大值)。这使得所有值显示为相同的颜色。因此,要阻止这种情况发生,请自行提供vminvmax