从XY坐标列表

时间:2018-02-07 22:42:08

标签: python animation matplotlib annotations

我正在尝试从xy坐标列表中设置注释动画。下面的代码为annotation行设置了动画,但我无法使用相同的代码为arrow函数设置动画。

示例数据集是我正在使用的数据的表示。它是水平格式的。有了这个,我从每个主题的所有X坐标和所有Y-Coordian中列出一个列表。然后我制作一个关于每个时间点的列表,这是每一行数据。从那里我可以绘制散点图和注释。

但是,当试图在两个单独的坐标之间绘制箭头时,我会遇到@ImportanceOfBeingErnest所述的错误。该函数应该是两个元素的元组,但我遇到箭头动画函数的问题,因为我认为我需要提供4个元素。第一个点的X和Y坐标以及第二个点的X和Y坐标。

我是否必须重新格式化该数据,或者是否有一种方法来设置箭头功能的动画是否需要4个元组?

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

x_data = np.random.randint(80, size=(400, 4))
y_data = np.random.randint(80, size=(400, 4))

lists = [[],[]]
lists[0] = x_data
lists[1] = y_data 

fig, ax = plt.subplots(figsize = (8,6))
ax.set_xlim(0,80)
ax.set_ylim(0,80)

scatter = ax.scatter(lists[0][0], lists[1][0], zorder = 5) #Scatter plot

annotation = ax.annotate('  Subject 1', xy=(lists[0][0][2],lists[1][0][2]))

arrow = ax.annotate('', xy = (lists[0][0][0], lists[1][0][0]), xytext = (lists[0][0][1],lists[1][0][1]), arrowprops = {'arrowstyle': "<->"})

def animate(i) : 
    scatter.set_offsets([[[[[lists[0][0+i][0], lists[1][0+i][0]], [lists[0][0+i][1], lists[1][0+i][1]], [lists[0][0+i][2], lists[1][0+i][2]], [lists[0][0+i][3], lists[1][0+i][3]]]]]])
    Subject_x = lists[0][0+i][2]
    Subject_y = lists[1][0+i][2]
    annotation.set_position((Subject_x, Subject_y))
    annotation.xy = (Subject_x, Subject_y)
    Arrow1 = (lists[0][0+i][0], lists[1][0+i][0]) #Code for arrow animation doesn't work. Produces a blank screen after the 1st frame
    Arrow2 = (lists[0][0+i][1], lists[1][0+i][1])
    arrow.set_position((Arrow1, Arrow2))
    arrow.xy = (Arrow1, Arrow2)

ani = animation.FuncAnimation(fig, animate,
                          interval = 50, blit = False)

plt.show()

1 个答案:

答案 0 :(得分:2)

在这个问题中仍然给出了解决方案: Animate points with labels with mathplotlib

正如评论中多次所说,每个职位由两个值(x,y)的元组决定。因此,您无法为这些位置提供元组元组。此外,箭头的开始和结束当然应该处于不同的位置。

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

x_data = np.random.randint(80, size=(400, 4))
y_data = np.random.randint(80, size=(400, 4))


fig, ax = plt.subplots(figsize = (8,6))
ax.set_xlim(0,80)
ax.set_ylim(0,80)

scatter = ax.scatter(x_data[0], y_data[0], zorder = 5) #Scatter plot

annotation = ax.annotate('  Subject 1', xy=(x_data[0,2],y_data[0,2]))

arrow = ax.annotate('', xy = (x_data[0,0], y_data[0,0]), 
                        xytext = (x_data[0,1],y_data[0,1]), 
                        arrowprops = {'arrowstyle': "<->"})

def animate(i) : 
    scatter.set_offsets(np.c_[x_data[i,:], y_data[i,:]])

    annotation.set_position((x_data[i,2], y_data[i,2]))

    start = (x_data[i,0], y_data[i,0]) 
    end   = (x_data[i,1], y_data[i,1])
    arrow.set_position(start)
    arrow.xy = end

ani = animation.FuncAnimation(fig, animate, frames=len(x_data), 
                              interval = 700, blit = False)

plt.show()