繁体   English   中英

使用 pyqtgraph 实时绘制许多子图

[英]Live plotting of many subplots using pyqtgraph

我使用了这个问题并试图用它来对许多子图进行快速实时绘图。

不幸的是,我很难理解代码,因此我在根据需要更改它时遇到了问题。

我想创建一个 10x10 像素的 2x2 矩阵的子图。 现在我得到以下信息:

在此处输入图片说明

代码如下所示:

from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import numpy as np
import time
import sys

class App(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(App, self).__init__(parent)

        #### Create Gui Elements ###########
        self.mainbox = QtGui.QWidget()
        self.setCentralWidget(self.mainbox)
        self.mainbox.setLayout(QtGui.QVBoxLayout())

        self.canvas = pg.GraphicsLayoutWidget()
        self.mainbox.layout().addWidget(self.canvas)

        self.label = QtGui.QLabel()
        self.mainbox.layout().addWidget(self.label)

        self.view = self.canvas.addViewBox()
        self.view.setAspectLocked(True)
        self.view.setRange(QtCore.QRectF(0, 0, 50, 50))

        self.img = []
        for i in range(4): 
            self.img.append(pg.ImageItem(None, border="w"))
            self.canvas.nextRow()
            self.view.addItem(self.img[i])

        self._update()

    def _update(self):
        for i in range(4):
            self.data = np.random.rand(10,10)
            self.img[i].setImage(self.data)

        QtCore.QTimer.singleShot(1, self._update)

def sensor_data(n_sensors, x_res, y_res):
    return np.random.rand(n_sensors, x_res, y_res)

if __name__ == '__main__':
    while True:
        # Get sensor data
        data = sensor_data(4, 10, 10)
        # Pass data to live plot function?

    app = QtGui.QApplication(sys.argv)
    thisapp = App()
    thisapp.show()
    sys.exit(app.exec_())

有人可以告诉我我做错了什么吗?

您只构建了一个 ViewBox 并且在其中添加了项目并导致了问题,您必须做的是创建多个 ViewBox 并添加一个项目,如下所示:

from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import numpy as np


class App(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(App, self).__init__(parent)
        self.mainbox = QtGui.QWidget()
        self.setCentralWidget(self.mainbox)

        self.canvas = pg.GraphicsLayoutWidget()
        self.label = QtGui.QLabel()

        lay = QtGui.QVBoxLayout(self.mainbox)
        lay.addWidget(self.canvas)
        lay.addWidget(self.label)

        self.img_items = []

        for i in range(4):
            view = self.canvas.addViewBox()
            view.setAspectLocked(True)
            view.setRange(QtCore.QRectF(0, 0, 10, 10))
            it = pg.ImageItem(None, border="w")
            view.addItem(it)
            self.img_items.append(it)
            self.canvas.nextRow()

        timer = QtCore.QTimer(self, interval=1)
        timer.timeout.connect(self._update)
        timer.start()

    def _update(self):
        for item in self.img_items:
            data = np.random.rand(10, 10)
            item.setImage(data)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    thisapp = App()
    thisapp.show()
    sys.exit(app.exec_())

在此处输入图片说明

更新:

N×N

n = 2
for i in range(n):
    for j in range(n):
        view = self.canvas.addViewBox(i, j)
        view.setAspectLocked(True)
        view.setRange(QtCore.QRectF(0, 0, 10, 10))
        it = pg.ImageItem(None, border="w")
        view.addItem(it)
        self.img_items.append(it)

在此处输入图片说明

更新:

如果你想在一段时间内获取数据 True 你必须在一个新线程中进行以避免 GUI 被阻塞,你还必须给一个小的睡眠以便 GUI 可以更新:

from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import numpy as np


def sensor_data(n_sensors, x_res, y_res):
    return np.random.rand(n_sensors, x_res, y_res)


class Thread(QtCore.QThread):
    dataChanged = QtCore.pyqtSignal(np.ndarray)
    def run(self):
        while True:
            data = sensor_data(4, 10, 10)
            self.dataChanged.emit(data)
            QtCore.QThread.msleep(10)


class App(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(App, self).__init__(parent)
        self.mainbox = QtGui.QWidget()
        self.setCentralWidget(self.mainbox)

        self.canvas = pg.GraphicsLayoutWidget()
        self.label = QtGui.QLabel()

        lay = QtGui.QVBoxLayout(self.mainbox)
        lay.addWidget(self.canvas)
        lay.addWidget(self.label)

        self.img_items = []
        n = 2

        for i in range(n):
            for j in range(n):
                view = self.canvas.addViewBox(i, j)
                view.setAspectLocked(True)
                view.setRange(QtCore.QRectF(0, 0, 10, 10))
                it = pg.ImageItem(None, border="w")
                view.addItem(it)
                self.img_items.append(it)

    @QtCore.pyqtSlot(np.ndarray)
    def update_data(self, data):
        for i, v in enumerate(data):
            self.img_items[i].setImage(v)


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    thisapp = App()
    thread = Thread()
    thread.dataChanged.connect(thisapp.update_data)
    thread.start()
    thisapp.show()
    sys.exit(app.exec_())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM