如何使用Python和matplotlib获取动画补丁而不是n次绘制的补丁

时间:2017-06-18 22:50:06

标签: python animation matplotlib patch figures

我正在使用Python 2.7(Anaconda)和matplotlib在"桌面上获得方形补丁的动画。 square patch -background-,这样小方块必须沿着所需的方向(北,南,est,西)移动range = n位置(move = 1)。我第一次使用FuncAnimation,但作为情节,我只能将正方形绘制n次,而不是让它移动/动画。这是我的代码示例方向"南":

import matplotlib.pyplot as plt
import matplotlib.patches as ptc
from matplotlib import animation
import numpy as np
#__________________________________________________________________________PLOT
fig = plt.figure()
ax1 = fig.add_subplot(111,aspect='equal')

ax1.set_xlim((0,10))
ax1.set_ylim((0,10))

#________________________________________________FIGURES_VECTORS_INITIALIZATION
#DESK 
desk=np.matrix([[1,1],[9,1],[9,9],[1,9]]) #desk vertices
#setting initialization - DESK
def initDesk():
    ax1.add_patch(ptc.Polygon(desk, closed=True,
                          fill=False, hatch="/"))    

#SQUARE
squVer=np.matrix([[4.5,6.5],[5.5,6.5],[5.5,7.5],[4.5,7.5]]) #square vertices

#_____________________________________________________DIRECTIONS_INITIALIZATION 
move=1
null=0
#4DIRECTIONS
north=np.array(([+null,+move]))
south=np.array([+null,-move])
est=np.array([+move,+null])
west=np.array([-move,+null])

#_____________________________________________________________________ANIMATION
def animate(newPos):
    iniSqu=np.matrix(squVer)
    position=newPos

    for step in range (0,4):
        if step < 1: #starting point
            newPos=iniSqu
        else: 
            newPos=iniSqu+position
        square=ptc.Polygon(newPos, closed=True,
                             facecolor="blue")
        ax1.add_patch(square)
        iniSqu=newPos

anim = animation.FuncAnimation(fig, animate(south),init_func=initDesk(),repeat=True)

plt.show()

This is my output

关于什么可以解决问题并获得补丁动画而不是在同一个数字上绘制n次的建议?

1 个答案:

答案 0 :(得分:1)

你误解了ParserWarning: Falling back to the 'python' engine because the separator encoded in utf-8 is > 1 char long, and the 'c' engine does not support such separators; you can avoid this warning by specifying engine='python'. """Entry point for launching an IPython kernel. 的工作方式。它的签名是

FuncAnimation

其中FuncAnimation(figure, func, frames, ...) 是重复调用的函数,func是数字,列表或数组或生成器。

根据frames,使用新参数为每个时间步调用函数func。在上面的代码中,函数已经为每个调用执行了所有操作,这当然是不受欢迎的。相反,它应该为每次通话做一些不同的事情。

此外,你不应该自己调用这个函数,而只是将它提供给frames类,然后调用它。 所以它真的是FuncAnimaton而不是FuncAnimation(figure, func, frames, ...)

要制作动画以使广场向南移动四次,FuncAnimation(figure, func(something), frames, ...)将成为frames之类的列表。

frames = [south, south, south, south]

enter image description here