如何使用Matplotlib的动画绘制GroupBy Dataframe

时间:2018-01-25 13:41:51

标签: python opencv matplotlib plot

我目前正在尝试使用动画通过视频(使用OpenCV拍摄)绘制一组数据帧,但由于动画的绘图形式,我似乎无法找到绘制此特定数据帧的方法。

我设法使用以下代码自己绘制它(没有动画):

for ID, group in df.groupby('TrackID'):
        group.plot(kind='line', x='HeadX', y='HeadY', ax=ax,
                   label='ID ' + str(ID), rot=60)

我目前正在尝试:

def getImage():
    ret, frame = cap.read()
    image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    ax.xaxis.set_major_locator(ticker.FixedLocator(x_axis))
    ax.yaxis.set_major_locator(ticker.FixedLocator(y_axis))
    return image


def drawPlot():
    global df_gb
    frame_list = [x for x in range(frame_id - 44, frame_id + 1)
                  if x > 0 and x <= frame_id]
    df = dataset_sorted[dataset_sorted['FrameID'].isin(frame_list)]
    df_gb = df.groupby('TrackID')
    return df_gb


def updatefig(*fargs):
    global frame_id
    ax.set_xlim(0, 1920)
    ax.set_ylim(1080, 0)
    frame_id += 1
    im.set_array(getImage())
    track.set_data(drawPlot())
    return im, track

dataset = pd.read_csv(csv_file, sep=',', usecols=range(1, 9))
dataset_sorted = dataset.sort_values('FrameID')

unique_ids = dataset_sorted['FrameID'].unique()

cap = cv2.VideoCapture(video_file)
h = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) / 2
w = cap.get(cv2.CAP_PROP_FRAME_WIDTH) / 2
fig, ax = plt.subplots(1, 1, figsize=(w, h))

ax.xaxis.tick_top()
x_axis = list(np.linspace(0, 1920, num=16))
y_axis = list(np.linspace(1080, 0, num=9))

frame_id = 0

im = plt.imshow(getImage(), animated=True)
track, = ax.plot([], [], '-')

ani = animation.FuncAnimation(fig, updatefig, interval=1,
                              blit=True, repeat=False)
plt.show()

视频显示,但从未绘制情节。

基本上,如何在动画中使用df.plot()而不是将数据传递给空的ax.plot()?

0 个答案:

没有答案