I have a bar graph which retrieves its y values from a dict. Instead of showing several graphs with all the different values and me having to close every single one, I need it to update values on the same graph. Is there a solution for this?
Asked
Active
Viewed 1.5k times
2 Answers
14
Here is an example of how you can animate a bar plot.
You call plt.bar
only once, save the return value rects
, and then call rect.set_height
to modify the bar plot.
Calling fig.canvas.draw()
updates the figure.
import matplotlib
matplotlib.use('TKAgg')
import matplotlib.pyplot as plt
import numpy as np
def animated_barplot():
# http://www.scipy.org/Cookbook/Matplotlib/Animations
mu, sigma = 100, 15
N = 4
x = mu + sigma*np.random.randn(N)
rects = plt.bar(range(N), x, align = 'center')
for i in range(50):
x = mu + sigma*np.random.randn(N)
for rect, h in zip(rects, x):
rect.set_height(h)
fig.canvas.draw()
fig = plt.figure()
win = fig.canvas.manager.window
win.after(100, animated_barplot)
plt.show()

unutbu
- 842,883
- 184
- 1,785
- 1,677
-
What if we need to add new bars to the graph with each update? Also, how does fig.canvas.draw() compare to using FuncAnimation? – Burrito Nov 26 '21 at 08:10
5
I've simplified the above excellent solution to its essentials, with more details at my blogpost:
import numpy as np
import matplotlib.pyplot as plt
numBins = 100
numEvents = 100000
file = 'datafile_100bins_100000events.histogram'
histogramSeries = np.loadtext(file)
fig, ax = plt.subplots()
rects = ax.bar(range(numBins), np.ones(numBins)*40) # 40 is upper bound of y-axis
for i in range(numEvents):
for rect,h in zip(rects,histogramSeries[i,:]):
rect.set_height(h)
fig.canvas.draw()
plt.pause(0.001)

stochashtic
- 63
- 1
- 6
-
-
@László I cheat and take a desktop video as I don't need high quality. – stochashtic Aug 25 '19 at 12:04