ValueError: array shape must be (N,) or (N,2); got (50, 1) instead

Мой код это динамический график, который берет данные из базы данных,
в которой постоянно добавляются новые данные:

import numpy as np
import sqlite3
from PyQt5 import QtCore, QtWidgets
import pyqtgraph as pg


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        # Устанавливаем соединение с базой данных
        connection = sqlite3.connect('my_database.db')
        cursor = connection.cursor()
        # Выбираем всех пользователей
        cursor.execute('SELECT reg1_temp1 FROM region ORDER BY ID DESC LIMIT 50')
        reg = cursor.fetchall()
        reg = np.array(reg)
        print(reg)

        self.plot_graph = pg.PlotWidget()
        self.setCentralWidget(self.plot_graph)
        self.plot_graph.setBackground("w")
        pen = pg.mkPen(color=(255, 0, 0))
        self.plot_graph.setTitle("Temperature vs Time", color="b", size="20pt")
        styles = {"color": "red", "font-size": "18px"}
        self.plot_graph.setLabel("left", "Temperature (°C)", **styles)
        self.plot_graph.setLabel("bottom", "Time (min)", **styles)
        self.plot_graph.addLegend()
        self.plot_graph.showGrid(x=True, y=True)
        self.plot_graph.setYRange(0, 255)
        self.time = list(range(10))
        self.temperature = reg
        # Get a line reference
        self.line = self.plot_graph.plot(
            self.time,
            self.temperature,
            name="Temperature Sensor",
            pen=pen,
            symbol="+",
            symbolSize=15,
            symbolBrush="b"
        )
        # Add a timer to simulate new temperature measurements
        self.timer = QtCore.QTimer()
        self.timer.setInterval(100)
       self.timer.timeout.connect(self.update_plot)
        self.timer.start()

    def update_plot(self):
        connection = sqlite3.connect('my_database.db')
        cursor = connection.cursor()
        cursor.execute('SELECT reg1_temp1 FROM region ORDER BY ID DESC LIMIT 50')
        reg = cursor.fetchall()
        reg = np.array(reg)
        print(reg)

        self.time = self.time[1:]
        self.time.append(self.time[-1] + 1)
        self.temperature = self.temperature[1:]
        self.temperature.append([reg])
        self.line.setData(self.time, self.temperature)


app = QtWidgets.QApplication([])
main = MainWindow()
main.show()
app.exec()

Вот какие ошибки выходят, в чем их причина и что я делаю не так?

Traceback (most recent call last):
File "C:\Users\adrej\source\repos\create telemetria\create telemetria\programm.py", line 83, in main = MainWindow()
File "C:\Users\adrej\source\repos\create telemetria\create telemetria\programm.py", line 41, in init self.line = self.plot_graph.plot( File "C:\Python39\lib\site-packages\pyqtgraph\graphicsItems\PlotItem\PlotItem.py", line 630, in plot
item = PlotDataItem(*args, **kargs)
File "C:\Python39\lib\site-packages\pyqtgraph\graphicsItems\PlotDataItem.py", line 375, in init self.setData(*args, **kargs)
File "C:\Python39\lib\site-packages\pyqtgraph\graphicsItems\PlotDataItem.py", line 739, in setData dtyp = dataType(args[0]), dataType(args[1])
File "C:\Python39\lib\site-packages\pyqtgraph\graphicsItems\PlotDataItem.py", line 1247, in dataType raise ValueError('array shape must be (N,) or (N,2); got %s instead' % str(obj.shape))
ValueError: array shape must be (N,) or (N,2); got (50, 1) instead

Process finished with exit code 1



Изменено:

В reg у меня приходит, примерно, вот такие данные:

[
    [136] [207] [ 97] [ 50] [ 32] [119] [212] [ 47] [170] [178]
    [117] [127] [134] [ 64] [101] [118] [ 25] [137] [239] [117]
    [195] [ 41] [127] [209] [ 15] [222] [  7] [123] [201] [230]
    [132] [135] [207] [182] [194] [165] [ 86] [ 39] [169] [ 71]
    [ 31] [136] [ 91] [249] [124] [ 41] [236] [ 29] [ 66] [ 10]
]

Данные добавляются через локальный хост. Генерируются рандомные данные, отправляются пока что по локальному хосту и записываются в базу данных sql.
График самый простой линейный, высота температуры и долгота времени.


Ответы (1 шт):

Автор решения: S. Nick

Из Plotting With PyQtGraph:

Plotting in pyqtgraph

plot(*args, **kargs,)

PlotDataItem

Некоторые комментарии по тексту кода.
Я не знаю нужен ли вам будет дополнительный поток для получения данных из БД или вам будет достаточно QTimer()

import sys
#? import numpy as np                                          # ?
import pyqtgraph as pg
from PyQt5 import QtCore, QtWidgets
import sqlite3


import random                                                  # +
reg = [
    [136], [207], [ 97], [ 50], [ 32], [119], [212],
    [ 47], [170], [178], [117], [127], [134], [ 64],
    [101], [118], [ 25], [137], [239], [117], [195],
    [ 41], [127], [209], [ 15], [222], [  7], [123],
    [201], [230], [132], [135], [207], [182], [194],
    [165], [ 86], [ 39], [169], [ 71], [ 31], [136],
    [ 91], [249], [124], [ 41], [236], [ 29], [ 66],
    [ 10],
]
print(f'type(reg) ---> {type(reg)}\n') 


class MainWindow(QtWidgets.QMainWindow):
    ''' Динамический график температуры и времени 
    https://peps.python.org/pep-0008/#documentation-strings
    '''
    
    def __init__(self):
        super().__init__()

        self.new_data()

        self.plot_graph = pg.PlotWidget()
        self.setCentralWidget(self.plot_graph)
        self.plot_graph.setBackground("w")
        pen = pg.mkPen(color=(255, 0, 0))
        self.plot_graph.setTitle(
            "Temperature vs Time", color="b", size="20pt")
        styles = {"color": "red", "font-size": "18px"}
        self.plot_graph.setLabel("left", "Temperature (°C)", **styles)
        self.plot_graph.setLabel("bottom", "Time (min)", **styles)
        self.plot_graph.addLegend()
        self.plot_graph.showGrid(x=True, y=True)
        self.plot_graph.setYRange(0, 255)
 
#?        self.temperature = reg
        
        self.line = self.plot_graph.plot(
            self.time,
            self.temperature,
            name="Temperature Sensor",
            pen=pen,
            symbol="+",
            symbolSize=15,
            symbolBrush="b"
        )

        self.timer = QtCore.QTimer()
        self.timer.setInterval(2000)                # 2000 ms = 2 sec
        self.timer.timeout.connect(self.update_plot)
        self.timer.start()

    def update_plot(self):
        self.new_data()
        self.line.setData(self.time, self.temperature)

    def new_data(self):
        '''
        connection = sqlite3.connect('my_database.db')
        cursor = connection.cursor()
        cursor.execute('SELECT reg1_temp1 FROM region ORDER BY ID DESC LIMIT 50')
        reg = cursor.fetchall()
# ?        reg = np.array(reg)        # ? зачем вы это делаеть 
        print(reg)
        '''

        ''' я не поимаю как вы хотите сделать
        self.time = self.time[1:]
        self.time.append(self.time[-1] + 1)
        self.temperature = self.temperature[1:]
        self.temperature.append([reg])
        '''    
        # для теста просто формирую рандомные списки
# !!! Преобразуем список списков в список чисел
        self.temperature = [x for l in reg for x in l] 
# !!! для теста формируем рандомный список (две строки ниже)        
        number = random.randint(10, len(reg))
        self.temperature = random.choices(self.temperature, k=number) 

# ??? почему вы решили что ---> vv <---------------------------- # ???        
#        self.time = list(range(10))        
        self.time = list(range(len(self.temperature)))     
    

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка