【问题标题】:Matplotlib multiple animate multiple linesMatplotlib 多个动画多行
【发布时间】:2014-05-27 19:16:34
【问题描述】:

我一直在研究如何为飞行路径设置多条线的动画。我读取多个 GPS 文件的对象时间同步它们,它们根据时间为每条路径设置动画。我发现了如何在动画函数中使用 append 为一行设置动画。现在我需要为导入的文件添加第二个和第三个。

我知道问题在于我如何使用线条执行 set_data。我看过多个示例,但我不明白设置多行需要什么结构。是的,我是新手。

fig = plt.figure()
ax1 = plt.axes(xlim=(-108, -104), ylim=(31,34))
line, = ax1.plot([], [], lw=2)
plt.xlabel('Longitude')
plt.ylabel('Latitude')



plotlays, plotcols = [2], ["black","red"]
lines = []
for index in range(2):
    lobj = ax1.plot([],[],lw=2,color=plotcols[index])[0]
    lines.append(lobj)


def init():
    for line in lines:
        line.set_data([],[])
    return lines

x1,y1 = [],[]
x2,y2 = [],[]

frame_num = len(gps_data[0])

# animation function.  This is called sequentially
def animate(i):

    x = gps_data[0][i,3]
    y = gps_data[0][i,2]
    x1.append(x)
    y1.append(y)

    x = gps_data[1][i,3]
    y = gps_data[1][i,2]
    x2.append(x)
    y2.append(y)

    #X = np.array(x1, x2)
    #Y = np.array(y1, y2)

    #for index in range(0,1):
    for lnum,line in enumerate(lines):
        line.set_data([x1,y1, x2,y2])
    return lines,


# call the animator.  blit=True means only re-draw the parts that have changed.
anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=frame_num, interval=1, blit=True)


plt.show()

【问题讨论】:

    标签: matplotlib jquery-animate


    【解决方案1】:

    line2d artist 的 Matplotlib 文档解释了 set_data 的工作原理。它“接受:二维数组(行是 x、y)或两个一维数组。”它也适用于列表。你给了它一个四元素列表。您需要分别设置每行的 x 和 y 数据。我在下面包含了一个带有假数据的示例。

    import matplotlib.pyplot as plt
    from matplotlib import animation
    from numpy import random 
    
    fig = plt.figure()
    ax1 = plt.axes(xlim=(-108, -104), ylim=(31,34))
    line, = ax1.plot([], [], lw=2)
    plt.xlabel('Longitude')
    plt.ylabel('Latitude')
    
    plotlays, plotcols = [2], ["black","red"]
    lines = []
    for index in range(2):
        lobj = ax1.plot([],[],lw=2,color=plotcols[index])[0]
        lines.append(lobj)
    
    
    def init():
        for line in lines:
            line.set_data([],[])
        return lines
    
    x1,y1 = [],[]
    x2,y2 = [],[]
    
    # fake data
    frame_num = 100
    gps_data = [-104 - (4 * random.rand(2, frame_num)), 31 + (3 * random.rand(2, frame_num))]
    
    
    def animate(i):
    
        x = gps_data[0][0, i]
        y = gps_data[1][0, i]
        x1.append(x)
        y1.append(y)
    
        x = gps_data[0][1,i]
        y = gps_data[1][1,i]
        x2.append(x)
        y2.append(y)
    
        xlist = [x1, x2]
        ylist = [y1, y2]
    
        #for index in range(0,1):
        for lnum,line in enumerate(lines):
            line.set_data(xlist[lnum], ylist[lnum]) # set data for each line separately. 
    
        return lines
    
    # call the animator.  blit=True means only re-draw the parts that have changed.
    anim = animation.FuncAnimation(fig, animate, init_func=init,
                                   frames=frame_num, interval=10, blit=True)
    
    
    plt.show()
    

    【讨论】:

    • 谢谢!我用你的代码绘制了一个时间序列。但我不得不删除 blit=True,因为它使 x 轴上的值无法更新。
    • @Molly,如何根据代码中定义的 plotcols 添加图例?
    • 我收到错误:x = gps_data[0][0, i] TypeError: 'int' object is not subscriptable
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多