我想要几个子图,其中两个显示来自视频提要的帧,第三个显示以条形图显示的计算结果。创建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’
有什么想法可以将条形图作为子图“放置”,并与子图中的其他数据一起更新吗?
谢谢!
错误来自线路return im1, im2, rects。
return im1, im2, rects
在工作解决方案中,您有return rects,即您返回具有set_animated方法的艺术家列表。在失败的代码中,您将拥有一个BarContainer和两个艺术家的元组。如错误所示, AttributeError:’BarContainer’对象没有属性’set_animated’ 。
return rects
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()