pyqtgraph cross widget to plot 不工作?

pyqtgraph cross widget to plot not working?

我正在尝试添加 GraphicsLayoutWidgetLinearRegionItem,这两个比率是 4:1 或 m:n,但我没有在 [=13] 中找到任何布局=].所以我尝试了下面的代码,但不幸的是它不起作用并抛出了回溯错误信息。

代码


import pyqtgraph as pg
import numpy as np
from PyQt5.QtWidgets import *


class Chart(pg.GraphicsLayoutWidget):
    def __init__(self):
        super().__init__()
        self.data = np.linspace(0, 2*np.pi, 100)
        self.data = np.sin(self.data)
        self.p = self.addPlot(y=self.data)

class LR(pg.GraphicsLayoutWidget):
    def __init__(self, target):
        super().__init__()
        self.p = self.addPlot()  # type:pg.PlotItem
        self.target = target  # type: pg.PlotItem

        rg = (target.data[0], target.data[-1])
        self.p.setXRange(rg[0], rg[1], padding=0)
        self.lr = pg.LinearRegionItem([rg[0], rg[1]])
        self.lr.sigRegionChanged.connect(self.onLRChanged)
        self.p.addItem(self.lr)

    def onLRChanged(self):
        print(self.target, self.lr.getRegion())
        self.target.setXRange(*self.lr.getRegion())


class Win(QWidget):
    def __init__(self):
        super().__init__()
        lay = QVBoxLayout()

        self.chart = Chart()
        self.lr = LR(self.chart)

        lay.addWidget(self.chart)
        lay.addWidget(self.lr)

        lay.setStretch(0, 4)
        lay.setStretch(1, 1)
        self.setLayout(lay)


app = QApplication([])
win = Win()
win.show()
app.exec()

图片

错误
当用户在底部图形(绘图)
的两侧拖动 LinearRegionItem 线时,将显示回溯信息

环境
Python 3.8.10(tags/v3.8.10:3d8993a,2021 年 5 月 3 日,11:48:03)Win32 上的 [MSC v.1928 64 位 (AMD64)]

名称:pyqtgraph 版本:0.12.2
名称:numpy 版本:1.20.3
名称:PyQt5 版本:5.15.4

问题与拉伸因子无关,而是将范围设置为期望 QRect 的 GraphicsLayoutWidget,而不是期望导致该异常的元组的 PlotItem。另一方面,您可以改进如何根据数据范围放置初始范围,也最好使用信号。

from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget

import pyqtgraph as pg

import numpy as np


class Chart(pg.GraphicsLayoutWidget):
    def __init__(self, xdata, ydata):
        super().__init__()
        self.p = self.addPlot(x=xdata, y=ydata)


class LR(pg.GraphicsLayoutWidget):
    range_changed = pyqtSignal(float, float)

    def __init__(self, xmin, xmax):
        super().__init__()
        self.lr = pg.LinearRegionItem(values=(xmin, xmax))
        self.p = self.addPlot()
        self.p.addItem(self.lr)
        self.lr.sigRegionChanged.connect(self.handle_region_changed)

    def handle_region_changed(self, item):
        self.range_changed.emit(*item.getRegion())


class Win(QWidget):
    def __init__(self):
        super().__init__()

        xdata = np.linspace(0, 2 * np.pi, 100)
        ydata = np.sin(xdata)

        self.chart = Chart(xdata, ydata)
        self.lr = LR(xdata.min(), xdata.max())
        self.lr.range_changed.connect(self.chart.p.setXRange)

        lay = QVBoxLayout(self)
        lay.addWidget(self.chart, stretch=4)
        lay.addWidget(self.lr, stretch=1)


def main():
    app = QApplication([])
    win = Win()
    win.show()
    app.exec()


if __name__ == "__main__":
    main()