簡體   English   中英

如何解決錯誤並顯示圖表?

[英]How can I solve an error and display a graph?

我現在正在將來自 Aduino 的信號更改為頻域。 (fft) 但同樣的錯誤不斷彈出。 我不明白錯誤的原因。 你能解釋錯誤的原因嗎?

這是錯誤

PS C:\Users\xoska\Documents\workplace> cd 'c:\Users\xoska\Documents\workplace'; ${env:PYTHONIOENCODING}='UTF-8'; ${env:PYTHONUNBUFFERED}='1'; & 'C:\Users\xoska\AppData\Local\Programs\Python\Python37\python.exe' 'c:\Users\xoska\.vscode\extensions\ms-python.python-2019.11.49689\pythonFiles\ptvsd_launcher.py' '--default' '--client' '--host' 'localhost' '--port' '54326' 'c:\Users\xoska\Documents\workplace\test.py' 
Traceback (most recent call last):
  File "c:\Users\xoska\Documents\workplace\test.py", line 99, in update
    curve2.setData(frequencia[:int(guarda/2)], abs(np.real(data[:int(guarda/2)])))
  File "C:\Users\xoska\AppData\Local\Programs\Python\Python37\lib\site-packages\pyqtgraph\graphicsItems\PlotDataItem.py", line 461, in setData
    self.updateItems()
  File "C:\Users\xoska\AppData\Local\Programs\Python\Python37\lib\site-packages\pyqtgraph\graphicsItems\PlotDataItem.py", line 487, in updateItems
    self.curve.setData(x=x, y=y, **curveArgs)
  File "C:\Users\xoska\AppData\Local\Programs\Python\Python37\lib\site-packages\pyqtgraph\graphicsItems\PlotCurveItem.py", line 307, in setData
    self.updateData(*args, **kargs)
  File "C:\Users\xoska\AppData\Local\Programs\Python\Python37\lib\site-packages\pyqtgraph\graphicsItems\PlotCurveItem.py", line 353, in updateData
    raise Exception("X and Y arrays must be the same shape--got %s and %s." % (self.xData.shape, self.yData.shape))
Exception: X and Y arrays must be the same shape--got (100,) and (20,).

這是 Arduino 代碼。 它是打印值的簡單來源。

#include <math.h>

void setup() {

  Serial.begin(9600);

}

void loop() {
  for(float d = 0; d < 1; d+=0.001){
    float resultado = 7*sin(15 * 2 * PI * d) + 3*sin(13 * 2 * PI * d);
    Serial.println(resultado, 3);
                       // Sampling rate is 1/T -> 2000Hz
  }
} 

這是 python 代碼。 我正在使用pyqtgraph。

import sys
import glob
import serial
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
from collections import deque  # import a "circular" list
from threading import Thread, Lock

arduinoData = serial.Serial('com5', 9600)  # 115200


freq = 2000            # 1/T
guarda = 200             # 200
#r = range(0, int(freq/2+1), int(freq/guarda))
frequencia = np.fft.fftfreq(guarda, d=1/freq)

acelx = deque([], maxlen=guarda)

win = pg.GraphicsWindow()
win.setWindowTitle('Espectro')
pg.setConfigOption('foreground', 'w')

p2 = win.addPlot()
linha4 = pg.mkPen((255, 0, 0), width=2)
p2.addLegend(offset=(10, 5))

curve2 = p2.plot(acelx,
                 pen=linha4,
                 name="<span style='color: #ffffff; font-weight: bold; font-size: 12px'>Amplitude</span>")

p2.setRange(yRange=[0, 1000], xRange=[0, int(freq/2)])
p2.setLabel('bottom',
            text="<span style='color: #ffffff; font-weight: bold; font-size: 12px'>Frequency (Hz)</span>")
p2.showGrid(x=False, y=True)

i = 0
data = []
lock = Lock()

def data_input():
    global i, data
    for line in arduinoData:
        try:
            i+=1
            acelx.append(float(line))
            with lock:
                if i > len(acelx):
                    data = np.fft.fft(acelx)
        except ValueError:
            pass

# start the data input thread. This will run in the background unaffected by the GUI.
t = Thread(target=data_input)
t.daemon = True
t.start()

def update():
    if i > len(acelx):
        curve2.setData(frequencia[:int(guarda/2)], abs(np.real(data[:int(guarda/2)])))

timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(0)

if __name__ == '__main__':
    import sys
    QtGui.QApplication.instance().exec_()

例外:X 和 Y arrays 的形狀必須相同——得到 (100,) 和 (20,)

錯誤信息非常清楚。 您嘗試 plot 圖形並提供 100 個 x 值和 20 個 y 值。

這顯然行不通。

修復此錯誤

X 和 Y arrays 的形狀必須相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM