【问题标题】:Updating the matplotlib with new data points without removing previous data points in quick way使用新数据点更新 matplotlib,而不快速删除以前的数据点
【发布时间】:2021-08-20 12:08:57
【问题描述】:

我正在尝试使用新数据点更新绘图。但我遇到的问题是它很慢。我正在使用 draw_now 可能是这个堆栈问题的问题:why is plotting with Matplotlib so slow?

我尝试了该问题中提到的方法,但我仍然遇到同样的问题。

我从加速度计接收数据并使用该数据更新我的绘图。

from pyqtgraph.Qt import QtCore, QtGui
import threading
import pyqtgraph as pg 
import socket
import psutil
import time 
import struct 
import sys 
import collections 
import os
import PySimpleGUI as sg
import easygui 
import matplotlib.pyplot as plt 
from mpl_toolkits 
import mplot3d


BufferLength = 500 marker_size = 14

driver_name = 'sss.exe'


def get_pid_and_kill(process_name):
    for proc in psutil.process_iter():
        if proc.name() == process_name:
            p = psutil.Process(proc.pid)
            p.terminate()
            print("Process " + process_name + " terminated") def run_the_driver(driver_exe_name):
    from subprocess import Popen
    get_pid_and_kill(driver_exe_name.split("/")[-1])
    get_pid_and_kill(driver_exe_name.split("\\")[-1])
    get_pid_and_kill("cmd.exe")
    Popen([driver_exe_name])
    time.sleep(3)

def create_tcp_ip_socket():

    HOST = '145.0.0.1'
    PORT = 7060

    try:
        socket_connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        socket_connection.settimeout(3)
        socket_connection.connect((HOST, PORT))
        socket_connection.settimeout(1)
        print("Socket Successfully created")
    except socket.error as err:
        raise SystemExit("Socket creation failed with error %s" % err)


def open_exit_button():
    even_name = 'kill the driver'
    layout = [[sg.Button(even_name, button_color=('white', 'springgreen4'))]]

    window = sg.Window('Configurations', layout)
    while True:  # Event Loop
        event, values = window.read(timeout=10)

        if event == sg.WIN_CLOSED or event == even_name:
            if 0 == visualize_recorded_msg:
                get_pid_and_kill(driver_name.split(("/"))[-1])
                get_pid_and_kill(driver_name.split(("\\"))[-1])
            os._exit(1)
            break

    window.close()


class Visualizer(object):

    def __init__(self):
        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(111, projection="3d")
        self.ax.set_title('3D Points')
        self.ax.set_xlabel('X')
        self.ax.set_ylabel('Y')
        self.ax.set_zlabel('Z')
        self.ax.set_xlim(-2.5, 2.5)
        self.ax.set_ylim(0, 3)
        self.ax.set_zlim(-1.5, 1.5)

        self.app = QtGui.QApplication(sys.argv)

        self.view = pg.GraphicsLayoutWidget()
        self.view.setWindowTitle('')

        self.w1 = self.view.addPlot(row=0, col=0, title='Accelerometer 1')
        self.w1.showGrid(x=True, y=True)
        self.w1.addLegend()
        self.w1.setLabel(axis='bottom', text='Time [s]')
        self.w1.setLabel(axis='left', text='')
        self.w1.curve2 = self.w1.plot(name='')
        self.w1.curve3 = self.w1.plot(name='')

        self.w2 = self.view.addPlot(row=1, col=0, title='')
        self.w2.showGrid(x=True, y=True)
        self.w2.addLegend()
        self.w2.setLabel(axis='bottom', text='Time [s]')
        self.w2.setLabel(axis='left', text='')
        self.w2.curve2 = self.w2.plot(name='')
        self.w2.curve3 = self.w2.plot(name='')

        self.w3 = self.view.addPlot(row=2, col=0, title='Average')
        self.w3.showGrid(x=True, y=True)
        self.w3.setLabel(axis='bottom', text='Time [s]')
        self.w3.setLabel(axis='left', text='')
        self.w3.curve1 = self.w3.plot()

        self.w4 = self.view.addPlot(row=3, col=0, title='result ')
        self.w4.showGrid(x=True, y=True)
        self.w4.setLabel(axis='bottom', text='Time [s]')
        self.w4.setLabel(axis='left', text='')
        self.w4.curve1 = self.w4.plot()

        self.a = collections.deque(maxlen=BufferLength)
        self.b = collections.deque(maxlen=BufferLength)
        self.c = collections.deque(maxlen=BufferLength)
        self.d = collections.deque(maxlen=BufferLength)
        self.e = collections.deque(maxlen=BufferLength)
        self.f = collections.deque(maxlen=BufferLength)
        self.pos_x = collections.deque(maxlen=BufferLength)
        self.pos_y = collections.deque(maxlen=BufferLength)
        self.pos_z = collections.deque(maxlen=BufferLength)
        self.pos_x_out = collections.deque(maxlen=BufferLength)
        self.pos_y_out = collections.deque(maxlen=BufferLength)
        self.pos_z_out = collections.deque(maxlen=BufferLength)

        self.view.show()
        self.fig.show()
        self.fig.canvas.draw()

        self.prevFrameCnt = 0
        self.iteration_index = 0
        self.li_det = 0
        self.str_mot = 1

    @staticmethod
    def start():
        if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
            QtGui.QApplication.instance().exec_()

    def message_parser(self, data):
        out1 = struct.unpack("<L", data[0:4])[0]
        out2 = data[4]
        out3 = data[5]
        out4 = data[6]
        out5 = struct.unpack("<h", data[7:9])[0]
        out6 = struct.unpack("<H", data[9:11])[0]
        out7 = struct.unpack("<H", data[11:13])[0]
        out8 = struct.unpack("<H", data[17:19])[0]
        out9 = struct.unpack("<H", data[19:21])[0]
        out10 = struct.unpack("<H", data[19:21])[0]
        out11 = struct.unpack("<H", data[21:23])[0]
        out12 = struct.unpack("<H", data[23:25])[0]

        return [out1, out2, out3, out4, out5, out6, out7, out8, out9,out10, out11, out12]

    def update(self):
        try:
            data = socket_connection.recv(64)
        except socket.timeout as e:
            print(e)
        except (ConnectionResetError, OSError):
            raise SystemExit("server closed")

        output = self.message_parser(data)

        x = output[0]
        y = output[4]
        z = output[5]
        x1 = output[6]
        y1 = output[7]
        z1 = output[8]

        if self.prevFrameCnt == x:
            MovDet = output[1]
            LiDet = output[2]
            MotDet = output[3]

            self.a.append(y)
            self.c.append(z1)
            self.d.append(y1)

            self.w2.curve2.setData(self.c, pen=None, symbol='t', symbolPen=None, symbolSize=marker_size,
                                   symbolBrush=(0, 114, 189))
            self.w2.curve3.setData(self.d, pen=None, symbol='t1', symbolPen=None, symbolSize=marker_size,
                                   symbolBrush=(217, 83, 25))
            self.w3.curve1.setData(self.a, pen=None, symbol='d', symbolPen=None, symbolSize=marker_size,
                                   symbolBrush=('g'))
            self.w4.curve1.setData(self.f, pen=None, symbol='o', symbolPen=None,
                                   symbolSize=marker_size,
                                   symbolBrush=(217, 83, 25))

            if (1 == self.li_det) or (105 == LiDet):
                self.li_det = 1

        else:
            MovDet = output[1]
            LiDet = output[2]
            MotDet = output[3]

            pos_x = output[10]
            pos_y = output[11]
            pos_z = output[12]

            is_in = pos_z 0.5
            is_in = is_in and (pos_z < 0.6)
            is_in = is_in and (pos_x < 0.7)
            is_in = is_in and (pos_x 0.8)
            is_in = is_in and (pos_y 0.7)

            if is_in:
                self.pos_x.append(pos_x)
                self.pos_y.append(pos_x)
                self.pos_z.append(pos_x)
                self.ax.scatter3D(self.pos_x, self.pos_y, self.pos_z, color='green')
                self.fig.canvas.draw_idle() 
            else:
                self.pos_x_out.append(pos_x)
                self.pos_y_out.append(pos_x)
                self.pos_z_out.append(pos_x)
                self.ax.scatter3D(self.pos_x_out, self.pos_y_out, self.pos_z_out, color='green')
                self.fig.canvas.draw_idle()
#

            self.b.append(z1)
            self.d.append(y1)

            self.w1.curve2.setData(self.b, pen=None, symbol='t', symbolPen=None, symbolSize=marker_size,
                                   symbolBrush=(0, 114, 189))
            self.w1.curve3.setData(self.d, pen=None, symbol='t1', symbolPen=None, symbolSize=marker_size,
                                   symbolBrush=(217, 83, 25))
            self.prevFrameCnt = x

        self.view.show()   
          self.fig.show()


    def animation(self):
        timer = QtCore.QTimer()
        timer.timeout.connect(self.update)
        timer.start(1)
        self.start()


def visualization():
    v = Visualizer()
    v.animation()


def main():
    thread = threading.Thread(target=visualization)
    thread.start()
    open_exit_button()


if __name__ == '__main__':
    main()

但问题是,如果我绘制 matplot one 或 pyqt one,它的工作速度很快,FPS 没有任何延迟。但是当我同时绘制两者时,绘图函数在 pyqt 中的更新速度不是很快吗?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    基于堆栈Why Matplotlib is slow 中不同问题中发布的几个答案,Matplotlib 通常不太适合实时绘图。所以最好使用vispyVispy进行实时绘图。

    就我而言,使用 Vispy 绘图确实解决了更新绘图缓慢的问题

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2022-01-06
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 2017-03-04
      • 1970-01-01
      相关资源
      最近更新 更多