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?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
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()
回答2:
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.fromfile(file, int).reshape(-1,numBins) 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): [rect.set_height(h) for rect,h in zip(rects,histogramSeries[i,:])] fig.canvas.draw() plt.pause(0.001)