From b10f09c3e02dd43d569e3fb0f3b502e2be999e90 Mon Sep 17 00:00:00 2001 From: Patrick Date: Sat, 6 Jul 2024 18:19:11 +0200 Subject: [PATCH] added a Matplolib Plotter for async data --- Plotter.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 Plotter.py diff --git a/Plotter.py b/Plotter.py new file mode 100644 index 0000000..f5acb43 --- /dev/null +++ b/Plotter.py @@ -0,0 +1,53 @@ +import queue +import threading +import tkinter as tk + +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +from matplotlib.figure import Figure + + +class Plotter(tk.Frame): + def __init__(self, root, percent_lim: bool = False): + super().__init__(root) + + self.figure = Figure(figsize=(8, 8)) + self.axes = self.figure.add_subplot() + self.canvas = FigureCanvasTkAgg(self.figure, master=self) + self.canvas.get_tk_widget().pack() + + self.__queue = queue.Queue() + self.data = {} + + self.percent_lim = percent_lim + + self.master.after(1000, self.__update) + + def append(self, name: str, value): + self.__queue.put((name, value)) + + def __update(self): + to_update = False + while not self.__queue.empty(): + to_update = True + name, value = self.__queue.get() + + if name in self.data: + self.data[name].append(value) + else: + self.data[name] = [value] + + if to_update: + self.__update_plot() + + self.master.after(1000, self.__update) + + def __update_plot(self): + self.axes.cla() + if self.percent_lim: + self.axes.set_ylim(0, 1) + self.axes.set_xlim(left=0, auto=True) + for (name, values) in self.data.items(): + self.axes.plot(values, label=name) + + self.axes.legend() + self.canvas.draw()