Tkinter matplotlib画布对于实时数据更新太慢



我正在使用一个每秒发送100个读数的设备,我希望我的GUI有一个显示最后300个采集点的数据图。然而,我发现:

  1. 将新数据点附加到y轴队列

  2. 清除已经存在的绘图

  3. 绘制新数据列表

  4. 重新绘制画布

每一点后需要近0.2-0.4秒,这是令人难以置信的缓慢。

这是我目前正在使用的代码。while循环不断检查队列,一旦有一个新元素被推送到队列中,它就会用该元素作为参数来调用update。有人能对matplotlib的效率或替代方案提出一些改进吗?

class GraphFrame:
def __init__(self,root,channel,index):
self.root=root
self.frame=tk.Frame(self.root)
self.frame.pack(side=tk.LEFT)

self.y = Queue(maxsize = 300)

self.fig, self.axes = plt.subplots(1,1)
self.axes.plot(list(self.y.queue))
self.canvas = FigureCanvasTkAgg(self.fig, master=self.frame)
self.canvas.draw()
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, padx=5, pady=5)
def update(self, new_point):
if self.y.full():
self.y.get()
self.y.put(new_point)
self.fig.axes[0].clear()
self.fig.axes[0].plot(list(self.y.queue))
self.canvas.draw()

编辑:使用matplotlib的blitting并用带有Graph图像的标签替换Tkinter画布,成功地解决了这个问题。将尝试在github上上传代码并将其链接。

与其为每个新点重建图形,不如修改您现有的LineArtist。

class GraphFrame:
def __init__(self,root,channel,index):
self.root=root
self.frame=tk.Frame(self.root)
self.frame.pack(side=tk.LEFT)

self.y = Queue(maxsize = 300)

self.fig, self.axes = plt.subplots(1,1)
# capture the artist
self.line, = self.axes.plot(list(self.y.queue))
self.canvas = FigureCanvasTkAgg(self.fig, master=self.frame)
self.canvas.draw()
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, padx=5, pady=5)
def update(self, new_point):
if self.y.full():
self.y.get()
self.y.put(new_point)

# update the artist
self.line.set_xdata(list(range(len(self.y))))
self.line.set_ydata(list(self.y.queue))

最新更新