【问题标题】:Matplotlib animation, moving squareMatplotlib 动画,移动方块
【发布时间】:2015-11-02 11:18:24
【问题描述】:

我正在从文本文件中加载 x,y 坐标和偏航角。这些坐标是正方形中间的坐标,yaw 是正方形与 x 轴的夹角。在我的文本文件中,坐标正在改变。我想制作一个动画,其中正方形将移动(遵循文件中的坐标)并具有精确的偏航角。一个动画刻度应该代表一个正方形移动。我试过这段代码,它非常糟糕,无法正常工作。有任何想法吗?谢谢你。现在,我使用左下角而不是正方形的中间。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib as mpl
from matplotlib import animation

file_name = "Crobot_test_log.txt"
x = np.loadtxt(file_name, usecols=(0,))
y = np.loadtxt(file_name, usecols=(1,))
yaw = np.loadtxt(file_name, usecols=(2,))
#x = [0,1,2]
#y = [0,1,2]
#yaw = [0.0,0.5,1.3]
fig = plt.figure()
plt.axis('equal')
plt.grid()
ax = fig.add_subplot(111)
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
patch = patches.Rectangle((x[0],y[0]),1.2,1.0,fc ='y',angle = -np.rad2deg(yaw[0]))

def init():
    ax.add_patch(patch)
    return patch,
def animate(i):
    patch = patches.Rectangle((x[i],y[i]),1.2,1.0,fc ='y',angle = -np.rad2deg(yaw[i]))
    return patch,
anim = animation.FuncAnimation(fig, animate,
                               init_func=init,
                               frames=360,
                               interval=1,
                               blit=True)
plt.show()

【问题讨论】:

    标签: python animation matplotlib


    【解决方案1】:

    不要在animate中创建新的Rectangle,而是使用set_*方法来修改现有的patch

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.patches as patches
    from matplotlib import animation
    
    x = [0, 1, 2]
    y = [0, 1, 2]
    yaw = [0.0, 0.5, 1.3]
    fig = plt.figure()
    plt.axis('equal')
    plt.grid()
    ax = fig.add_subplot(111)
    ax.set_xlim(-10, 10)
    ax.set_ylim(-10, 10)
    
    patch = patches.Rectangle((0, 0), 0, 0, fc='y')
    
    def init():
        ax.add_patch(patch)
        return patch,
    
    def animate(i):
        patch.set_width(1.2)
        patch.set_height(1.0)
        patch.set_xy([x[i], y[i]])
        patch._angle = -np.rad2deg(yaw[i])
        return patch,
    
    anim = animation.FuncAnimation(fig, animate,
                                   init_func=init,
                                   frames=len(x),
                                   interval=500,
                                   blit=True)
    plt.show()
    

    【讨论】:

    • 谢谢,我也尝试过改变它而不是创建新的,但我无法改变角度,因为它没有设置方法。现在效果很好,谢谢。
    猜你喜欢
    • 2017-03-25
    • 2021-02-01
    • 1970-01-01
    • 2017-12-12
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多