【问题标题】:how to get animated patches instead of n-times plotted patches using Python and matplotlib如何使用 Python 和 matplotlib 获得动画补丁而不是 n 次绘制的补丁
【发布时间】:2017-06-18 22:50:05
【问题描述】:

我正在使用 Python 2.7 (Anaconda) 和 matplotlib 在“桌面”方形补丁 -background- 上获取方形补丁的动画,以便小方块必须沿着所需的方向移动(北、南、est ,west) 对于 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 次的建议?

【问题讨论】:

    标签: python animation matplotlib patch figures


    【解决方案1】:

    您误解了FuncAnimation 的工作方式。它的签名是

    FuncAnimation(figure, func, frames, ...)
    

    其中func 是被重复调用的函数,frames 是数字、列表或数组或生成器。

    根据frames,每个时间步都会调用函数func,并带有一个新参数。在您上面的代码中,该函数已经为每个调用完成了所有操作,这当然是不希望的。相反,它应该为每次调用做一些不同的事情。

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

    为了使动画使正方形向南移动四次,frames 将是一个类似frames = [south, south, south, south] 的列表。

    import matplotlib.pyplot as plt
    import matplotlib.patches as ptc
    from matplotlib import animation
    import numpy as np
    
    fig = plt.figure()
    ax1 = fig.add_subplot(111,aspect='equal')
    
    ax1.set_xlim((0,10))
    ax1.set_ylim((0,10))
    
    desk=np.matrix([[1,1],[9,1],[9,9],[1,9]]) #desk vertices
    #SQUARE
    squVer=np.matrix([[4.5,6.5],[5.5,6.5],[5.5,7.5],[4.5,7.5]]) #square vertices
    iniSqu=[squVer]
    
    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])
    
    deskpoly = [ptc.Polygon(desk, closed=True, fill=False, hatch="/")]
    squarepoly = [ptc.Polygon(iniSqu[0], closed=True, facecolor="blue")]
    
    def initDesk():
        ax1.clear()
        ax1.set_xlim((0,10))
        ax1.set_ylim((0,10))
        iniSqu[0] = squVer
        ax1.add_patch(deskpoly[0])
        ax1.add_patch(squarepoly[0])
    
    def animate(direction):
        iniSqu[0] = iniSqu[0] + direction
        squarepoly[0].remove()
        squarepoly[0] = ptc.Polygon(iniSqu[0], closed=True, facecolor="blue")
        ax1.add_patch(squarepoly[0])
    
    frames = (south, south, south, south)
    anim = animation.FuncAnimation(fig, animate, frames=frames, init_func=initDesk,repeat=True)
    
    plt.show()
    

    【讨论】:

    • 正是我的意思,完美解决(和解释)!
    猜你喜欢
    • 2020-05-22
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多