当前位置: 首页 > 知识库问答 >
问题:

如何保持活动图表只显示最后50个数据点?

凤自珍
2023-03-14

这篇文章与我之前的问题有关。在Tkinter中使用Arduino数据动态更新Label和Live Graph我的图形嵌入在Tkinter中。我使用的是相同的代码,但我意识到,虽然我的实时图形是根据来自Arduino的串行数据动态更新的,但旧的数据点只是不断添加。我想看到最后50个数据点被嵌入到实时图形中,并删除旧的数据点。我不知道如何操纵代码来实现我想要实现的目标。如有任何建议,将不胜感激

代码如下:

#from tkinter import *
import tkinter as tk # proper way to import tkinter
import serial
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.animation as animation
from matplotlib import style
style.use("ggplot")
import threading

class Dee(tk.Frame):
    def __init__(self, master=None, title='', ylabel='', label='', color='c', ylim=1, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        self.data = []
        fig = Figure(figsize = (7,6))
        self.plot = fig.add_subplot(111)
        self.plot.set_title(title)
        self.plot.set_ylabel(ylabel)
        self.plot.set_ylim(0, ylim)
        self.line, = self.plot.plot([], [], color, marker = 'o',label = label)
        self.plot.legend(loc='upper left')

        label = tk.Label(self, text = ylabel, font = "Times 22 bold")
        label.grid(row = 0, column = 3)
        button_1 = tk.Button(self, text = "Back To Homepage", command = F1.tkraise)
        button_1.grid(row = 1, column = 2)
        label_1 = tk.Label(self, text = "Current Value: ", font = "Verdana 10 bold")
        label_1.grid(row = 2, column = 2)
        self.label_data = tk.Label(self, font = "Verdana 10")
        self.label_data.grid(row = 2, column = 3)
        canvas = FigureCanvasTkAgg(fig, master=self)
        canvas.get_tk_widget().grid(row = 3, column = 3)

        ani = animation.FuncAnimation(fig, self.update_graph, interval = 1000, blit = False)
        canvas.draw()

    def update_graph(self, i):
        if self.data:
        self.line.set_data(range(len(self.data)), self.data)
        self.plot.set_xlim(0, len(self.data))

    def set(self, value):
        self.data.append(value)
        self.label_data.config(text=value)

my_window = tk.Tk()
my_window.title("Graphical User Interface Demo#1")
my_window.geometry("720x720")

F1 = tk.Frame(my_window)
F2 = Dee(my_window, title='Temperature Graph', ylabel='Temperature', color='c', label='Degrees C', ylim=40)
F3 = Dee(my_window, title='Humidity Graph', ylabel='Humidity', color='g', label='Percentage %', ylim=100)
F4 = Dee(my_window, title='Solved Water Graph', ylabel='Water Volume', color='b', label='mL', ylim=55)

#For Frame One
label_1 = tk.Label(F1, text = "Homepage of GUI", font = "Times 22 bold")
label_1.grid(row = 0, column = 3)
button_1 = tk.Button(F1, text = "Page of Humidity", bd = 8, command = F2.tkraise)
button_1.grid(row = 1, column = 2)
button_2 = tk.Button(F1, text = "Page of Temperature", bd = 8, command = F3.tkraise)
button_2.grid(row = 1, column = 3)
button_3 = tk.Button(F1, text = "Page of Water",  bd = 8, command = F4.tkraise)
button_3.grid(row = 1, column = 4)

for frame in(F1, F2, F3, F4):
    frame.grid(row = 0, column = 0, sticky = "NSEW")

F1.tkraise()

def get_data():
    #Initialization of Serial Comm
    ser = serial.Serial('COM3', 9600)
    while True:
        pulldata = ser.readline().decode('ascii')
        get_data = pulldata.split(',')
        F2.set(int(get_data[0]))
        F3.set(int(get_data[1]))
        F4.set(int(get_data[2]))
        print(pulldata)

# start the thread that will poll the arduino
t = threading.Thread(target=get_data)
t.daemon = True
t.start()

my_window.mainloop()

共有1个答案

艾凌龙
2023-03-14

若要仅从数组中选择最后n个数据,请使用

data[-n:]

让绘图自动缩放使用

ax.autoscale()
 类似资料:
  • 我正在动画一个ImageView来向上移动它。一切正常,但是当我呈现一个ViewController时,ImageView会切换回它的原始位置。 我已经尝试在动画完成时设置帧,但它仍然切换回其原始位置。 我的工作如下: 任何想法如何解决这个问题?我认为它与视图有关Dissapering...

  • 我正在使用chart.js在一个页面上显示多个折线图。然而,只有最后一张图表显示,尽管我称之为“canvas1”和“canvas2”。有些地方一定有冲突,我试过很多东西,但没有任何乐趣。以下是两个图表,仅显示最后一个: 图一 图二: 你的帮助将不胜感激,已经打扰我一段时间了! 提前谢谢

  • 我试图使用文本视图来显示从列表视图中选择的联系人。列表视图包含用户从加载到列表视图中的Android电话簿中选择的联系人。文本视图将只显示列表视图中的最后一项,即使用户选择了另一个不是列表视图中最后一个联系人的联系人。 即使在我的日志打印中,我可以看到我选择了哪个联系人,但当我试图将其打印到另一个窗口中的文本视图时,它仍然默认为最后一个联系人。 添加调制解调器。JAVA 主要活动。JAVA

  • 问题内容: 我正在使用POST方法。我需要创建一次,并且应该使用Keep Alive Connection。但是我认为,它每次都会建立一个新的连接。 因此,我需要使用 保持活动 连接。 这是我的代码段,很多帮助将不胜感激。 而且logcat日志是: 问题答案: 10:07:29.746:D / org.apache.http.headers(1529):>>连接:保持活动 您正在要求保持活动状态。

  • 我在3台虚拟机上安装了hadoop 3.1.1,在Ubuntu上安装了VMware。当我运行hdfs namenode时,格式化并启动所有。sh然后jps在我的主节点和两个从节点上正常工作。 但是,使用hdfs dfsadmin-report命令,我只能看到一个活动数据节点(当我检查master:50070或8088时得到相同的结果)。 我试图禁用防火墙如下:ufw禁用,但它没有解决问题。这3台机

  • 我试图用这段代码来显示我的个人档案活动: 当我点击Profile菜单项时,我可以看到我的ProfileActivity,但我的ActionBar上没有任何back按钮来返回我以前的活动。 那么,我如何显示一些后退按钮?我的代码是否正确以显示菜单中的活动?