我的应用程序正在以大约30fps的速度通过网络接收数据,并且需要根据此新数据动态更新水平条形图。
我为此目的在tkinter窗口中使用matplotlib图形。对我的代码进行性能分析表明,我的代码中的主要瓶颈是对该数字的更新。
下面给出了代码的简化版本:
def update_bars(self):
"""
Updates a horizontal bar chart
"""
for bar, new_d in zip(self.bars, self.latest_data):
bar.set_width(new_d)
self.figure.draw()
我遇到的滞后很明显,并且会随着时间的推移而迅速增长。有没有更有效的方法来更新matplotlib图形?任何帮助都会很棒。
编辑:我将在this寻找可能的加速技巧。如果有什么事情我会更新。
最佳答案
您可以更新绘图对象的数据。但是在某种程度上,您无法更改图形的形状,可以手动重置x和y轴限制。
例如
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 6*np.pi, 100)
y = np.sin(x)
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
line1, = ax.plot(x, y)
for phase in np.linspace(0, 10*np.pi, 500):
line1.set_ydata(np.sin(x + phase))
# render the figure
# re-draw itself the next time
# some GUI backends add this to the GUI frameworks event loop.
fig.canvas.draw()
fig.canvas.flush_events() # flush the GUI events
flush_events
刷新图形的GUI事件。仅针对后端实施
使用GUI。
flush_events确保GUI框架有机会运行其事件循环并清除所有GUI事件。有时,此操作需要放在
try/except
块中,因为此方法的默认实现是引发NotImplementedError
。在上面的代码中,draw将渲染该图,也许删除
draw
仍然可以。但是在某种程度上它们有所不同。关于python - 在gui中更新matplotlib图的有效方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42872142/