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) insteadProcess 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 шт):
Из Plotting With PyQtGraph:
Некоторые комментарии по тексту кода.
Я не знаю нужен ли вам будет дополнительный поток для
получения данных из БД или вам будет достаточно 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_())