我希望有几个子图,其中两个显示来自视频源的帧,第三个显示计算结果作为条形图。 在创建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 :(得分:1)
错误来自第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()