Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to animate a bar char being updated in Python

I want to create an animated, stacked bar chart.

There is a great tutorial, which shows how to animate line graphs.

However, for animating bar charts, the BarContainer object, does not have any attribute to 'set_data'. I am therefore forced to clear the figure axes each time, e.g. ,

fig=plt.figure()

def init():
    plt.cla()

def animate(i):

    p1 = plt.bar(x_points,y_heights,width,color='b')

return p1


anim = animation.FuncAnimation(fig,animate,init_func=init,frames=400,interval=10,blit=False)

Is there an alternative option, following the style of the link, such that I do not have to clear the axes each time? Thanks.

like image 848
user1887919 Avatar asked Oct 18 '22 06:10

user1887919


1 Answers

You'll want to call plt.bar outside of animation(), update the height of each bar with Rectangle.set_height as new data comes in.

In practice, loop through each incoming set of y_heights zipped with the list of Rectangles returned by plt.bar() as seen below.

p1 = plt.bar(x_points,y_heights,width,color='b')

def animate(i):
    for rect, y in zip(p1, y_heights):
        rect.set_height(y)

anim = animation.FuncAnimation(fig,animate,init_func=init,frames=400,interval=10,blit=False)

You might want to put p1 in your init() but that's up to you!

All credit for this answer goes to unutbu's answer in the related question Updating a matplotlib bar graph?. I would've added in a comment but I'm obviously quite new.

like image 56
T. Hoyt Avatar answered Oct 22 '22 09:10

T. Hoyt