matplotlib 不确定为什么我的Pyplot子图不会随时间更新

ql3eal8s  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(151)

我正在做一个项目,它需要我记录一段时间内的数据,同时还需要在屏幕上用实时线图绘制数据。到目前为止,除了线图,我已经得到了所有的数据,但不确定我做错了什么。这是我目前正在使用的导入。

`
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 pyplot as plt
from matplotlib import style
from tkinter import *
from PIL import Image
import numpy as np
import serial
from serial import Serial
import sqlite3
import time
from datetime import datetime
from array import *
import cv2
from pathlib import Path
from itertools import count
`

用于Y轴绘图的数据存储在一个数据数组中。该数组中的每个索引保存传感器的最后读取值,i=0表示传感器1,依此类推。

`
A=[0,0,0,0,0,0,0,0]
`

这是我试图画出的子情节的定义。我认为我设置得正确,但是我没有得到预期的结果,所以很可能没有。

`
fig1 = plt.Figure(dpi=100, facecolor="#f0f0f0")
a = fig1.add_subplot(111)
a.patch.set_facecolor("#f0f0f0")

a.set_xlabel('time (Sec)')
a.set_ylabel('pressure(kPa)')
a.set_ylim(0,100)
a.set_xlim(0,30)

graph1 = FigureCanvasTkAgg(fig1, master=root)
graph1.get_tk_widget().place(x=10, y=220, width=210, height=280)
graph1.draw();
`

我目前只是想在处理多条线重叠的小问题之前先画一条线。这是我想用来画这条线的函数。

`
def graph_plotdata():
    global A
    global a
    line1 = []
    time = []

    time.append(next(index))
    line1.append(A[0])

    a.cla()
    a.plot(time, line1)
    
    graph1.draw()
`

为了解决这个问题,我已经尝试了几次这个代码的迭代。最接近我必须让它工作的是在当前状态下,其中正在发生的事情,但不是保持我的最小和最大限制的图形,它完全重新格式化我的绘图和绘图的“不可见”线。
开始前:interface program
启动后:interface reformatted
当涉及到python库时,我并没有太多的经验。

46qrfjad

46qrfjad1#

我使用字典来存储各种线和线图,然后使用set_data(xdata,ydata)更新线图。我不确定您的数据流是如何工作的,所以我的字典只在我按下更新按钮并生成随机阅读时更新。显然,您需要更改这些部分以匹配您的数据输入。

fig, ax = plt.subplots(1, 1)

plt.subplots_adjust(bottom = 0.20)

num_sensors = 10

latest_reading = [0]*num_sensors

lines = {index: [0] for index in range(num_sensors)}

times = [0]

line_plots = {index: ax.plot(lines[index])[0] for index in range(num_sensors)}

btn_ax = plt.axes([0.475, 0.05, 0.10, 0.05])

def update(event):
    
    latest_reading = np.random.randint(0, 10, num_sensors)
    
    times.append(times[-1] + 1)
    
    for index in range(num_sensors):
        lines[index].append(latest_reading[index])
        
        line_plots[index].set_data(times, lines[index])
        
    # Adjust limits
    
    max_time_window = 20
    
    ax.set_xlim(max(0, max(times)-max_time_window), max(times))
    ax.set_ylim(0, max(lines))
    
    plt.draw()
    

btn = mpl.widgets.Button(btn_ax, 'Update')

btn.on_clicked(update)

相关问题