【问题标题】:How can I solve an error and display a graph?如何解决错误并显示图表?
【发布时间】:2020-03-16 22:05:17
【问题描述】:

我现在正在将来自 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_()

【问题讨论】:

  • 您的代码存在比您得到的错误更深层次的问题。你确定你从串口得到任何数据吗?我认为您迭代端口对象(for line in arduinoData:)的方式没有任何意义......而且多线程部分看起来也不好看。也许你应该看看其他代码 sn-ps,例如看到this one

标签: python arduino fft pyqtgraph


【解决方案1】:

例外:X 和 Y 数组的形状必须相同——得到 (100,) 和 (20,)

错误信息很清楚。您尝试绘制图表并提供 100 个 x 值和 20 个 y 值。

这显然行不通。

修复这个错误

X 和 Y 数组的形状必须相同

【讨论】:

    猜你喜欢
    • 2018-01-08
    • 2014-05-11
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2021-09-18
    • 2023-01-18
    • 2021-01-26
    相关资源
    最近更新 更多