我的应用程序正在以大约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/

10-12 20:24
查看更多