Python 该图形不是在matplotlib中绘制的

Python 该图形不是在matplotlib中绘制的,python,matplotlib,fft,Python,Matplotlib,Fft,我用Arduino数据转换为FFT,在matplotlib中绘制一个图形。但是,相同的错误不会导致图形。我想这是因为更新中的self()我该怎么办?当我的代码中出现类型错误时,我不知道如何更改。如果你发现问题,能告诉我吗? +我解决了这个错误。但是,该图表未打印。代码已作为一个整体进行了修改。发生了什么事 from PyQt5.QtWidgets import* from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as

我用Arduino数据转换为FFT,在matplotlib中绘制一个图形。但是,相同的错误不会导致图形。我想这是因为更新中的self()我该怎么办?当我的代码中出现类型错误时,我不知道如何更改。如果你发现问题,能告诉我吗?
+我解决了这个错误。但是,该图表未打印。代码已作为一个整体进行了修改。发生了什么事

from PyQt5.QtWidgets import*
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import random
from PyQt5 import QtCore, QtGui, QtWidgets
import datetime
import serial
import time
import random
import numpy as np
from matplotlib import animation
from collections import deque  # import a "circular" list
from threading import Thread, Lock

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1212, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.widget = matplotlibWidget()
        self.widget.setObjectName("widget")
        self.gridLayout.addWidget(self.widget, 0, 0, 1, 1)

        self.centralwidget.setLayout(self.gridLayout)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
#from matplotlibwidgetFile import matplotlibWidget

class matplotlibWidget(QWidget):

    def __init__(self, parent = None):
        QWidget.__init__(self,parent)
        self.i = 0
        self.data = []
        lock = Lock()        

        freq = 2000              # 1/T
        self.guarda = 100           # 200
        r = range(0, int(freq/2+1), int(freq/self.guarda))
        self.frequencia = np.fft.fftfreq(self.guarda, d=1/freq)
        self.acelx = deque([], maxlen=self.guarda)

        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(111)
        self.canvas = FigureCanvas(self.fig)  
        self.right_layout = QVBoxLayout() 
        self.right_layout.addWidget(self.canvas)
        self.setLayout(self.right_layout)
        self.ax.set_xlim((0,int(freq/2)))
        self.ax.set_ylim((0,1000))
        self.line, = self.ax.plot([],[])
        self.ax.grid(True)


        def data_input():
            for line in arduinoData:
                try:
                    self.i+=1
                    self.acelx.append(float(line))
                    with lock:
                        if self.i > len(self.acelx):
                            self.data = np.fft.fft(self.acelx)
                except ValueError:
                    pass
        t = Thread(target=data_input)
        t.daemon = True
        t.start()

        S = Scope(self.line,self.frequencia, self.guarda, self.data, self.ax, self.acelx, self.i )
        timer = QtCore.QTimer()
        timer.timeout.connect(S.update)
        timer.start(0)

class Scope(matplotlibWidget) : 
    def __init__(self, line, frequencia, guarda, data, ax, acelx, i) :
        self.line, = line,
        self.ax = ax
        self.frequencia = frequencia
        self.guarda = guarda
        self.data = data
        self.acelx = acelx
        self.i = i

    def update(self) :

        if self.i > len(self.acelx) :
            self.line.set_data(self.frequencia[:int(self.guarda/2)], abs(np.real(self.data[:int(self.guarda/2)])))
            self.ax.figure.canvas.draw()

        return (self.line,)           



if __name__ == "__main__":
    import sys
    value = [0,0,0,0,0,0,0,0,0,0]
    arduinoData = serial.Serial('com5', 9600)
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

您必须创建实例:

s = Scope()
timer = QtCore.QTimer()
timer.timeout.connect(s.update)


您必须创建实例:

s = Scope()
timer = QtCore.QTimer()
timer.timeout.connect(s.update)


谢谢你的回答。但它不起作用。出现了新错误。出现了异常:TypeError uuu init uuuu()缺少7个必需的位置参数:“line”、“frequencia”、“guarda”、“data”、“ax”、“acelx”和“i”。对,您必须将它们传递到您在此处声明的作用域:类作用域(matplotlibWidget):def uu init uuuu(self、line、frequencia、guarda、data、ax、acelx、i)我解决了这个错误。但是,该图表未打印。代码已作为一个整体进行了修改。修改后的代码已重新上载。您必须发布错误代码,全文。我没有arduino,所以我猜不出你的问题)谢谢你的回答。但它不起作用。出现了新错误。出现了异常:TypeError uuu init uuuu()缺少7个必需的位置参数:“line”、“frequencia”、“guarda”、“data”、“ax”、“acelx”和“i”。对,您必须将它们传递到您在此处声明的作用域:类作用域(matplotlibWidget):def uu init uuuu(self、line、frequencia、guarda、data、ax、acelx、i)我解决了这个错误。但是,该图表未打印。代码已作为一个整体进行了修改。修改后的代码已重新上载。您必须发布错误代码,全文。我没有arduino,所以我猜不出你的问题)