subplot2grid中的条形图

发布于 2021-01-29 15:02:37

我想要几个子图,其中两个显示来自视频提要的帧,第三个显示以条形图显示的计算结果。创建matplotlib图形后,我创建了几个subplot2grids,然后使用FuncAnimation更新了它们。

创建条形图(待更新)的通常方法是:

fig = plt.figure()
ax = plt.axes(xlim=(0, 9), ylim=(0, 100))
rects = plt.bar(res_x, res_y, color='b')

def animate(args):
    ...
    ...
    for rect, yi in zip(rects, results):
        rect.set_height(yi*100)
    return rects

anim = animation.FuncAnimation(fig, animate, frames=200, interval=20, blit=True)
plt.show()

我现在正尝试在其他子图旁边添加条形图:

fig = plt.figure()
plt1 = plt.subplot2grid((2, 2), (0, 0), rowspan=2)
plt2 = plt.subplot2grid((2, 2), (0, 1))

#Confusion with the following
bar_plot = plt.subplot2grid((2,2), (1,1))
ax = plt.axes(xlim=(0, 9), ylim=(0, 100))
rects = plt.bar(res_x, res_y, color='b')


def animate(args):
    ...
    ...

    im1 = plt1.imshow(...)
    im2 = plt2.imshow(...)

    for rect, yi in zip(rects, results):
        rect.set_height(yi*100)
    return im1, im2, rects

anim = animation.FuncAnimation(fig, animate, frames=200, interval=20, blit=True)
plt.show()

我收到以下错误:AttributeError:’BarContainer’对象没有属性’set_animated’

有什么想法可以将条形图作为子图“放置”,并与子图中的其他数据一起更新吗?

谢谢!

关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    错误来自线路return im1, im2, rects

    在工作解决方案中,您有return rects,即您返回具有set_animated方法的艺术家列表。在失败的代码中,您将拥有一个BarContainer和两个艺术家的元组。如错误所示,
    AttributeError:’BarContainer’对象没有属性’set_animated’

    一个解决方案可能是生成BarContainer的内容列表,您可以将其连接到其他两位艺术家。

    return [rect for rect in rects]+[im1, im2]
    

    一个完整的工作示例:

    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    
    res_x, res_y = [1,2,3], [1,2,3]
    
    fig = plt.figure()
    ax = plt.subplot2grid((2, 2), (0, 0), rowspan=2)
    ax2 = plt.subplot2grid((2, 2), (0, 1))
    ax3 = plt.subplot2grid((2,2), (1,1))
    
    rects = ax3.bar(res_x, res_y, color='b')
    im1 = ax.imshow([[1,2],[2,3]], vmin=0)
    im2 = ax2.imshow([[1,2],[2,3]], vmin=0)
    
    def animate(i):
    
        im1.set_data([[1,2],[(i/100.),3]])
        im2.set_data([[(i/100.),2],[2.4,3]])
    
        for rect, yi in zip(rects, range(len(res_x))):
            rect.set_height((i/100.)*(yi+0.2))
        return [rect for rect in rects]+[im1, im2]
    
    anim = animation.FuncAnimation(fig, animate, frames=200, interval=20, blit=True)
    plt.show()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看