pyqtgraph 交叉小部件绘图不起作用?

Posted

技术标签:

【中文标题】pyqtgraph 交叉小部件绘图不起作用?【英文标题】:pyqtgraph cross widget to plot not working? 【发布时间】:2021-10-15 15:47:22 【问题描述】:

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

代码


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, May 3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32

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

【问题讨论】:

我没有收到任何错误,你用的是什么版本的pyqtgraph? @eyllanesc 在我的帖子中更新环境信息。 @eyllanesc 当用户在底部图形(绘图)的两侧拖动LinearRegionItem 线时,将显示回溯信息。 您的方法让我感到困惑,因为您说拉伸因素导致了错误,但事实并非如此。 【参考方案1】:

该问题与拉伸因子无关,而是将范围设置为期望 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()

【讨论】:

我发现我的方法也可以,我犯了一个低级错误,我应该将onLRChanged更改为self.target.p.setXRange(*self.lr.getRegion())

以上是关于pyqtgraph 交叉小部件绘图不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

pyqtgraph 绘图小部件未更新

如何将鼠标点击信号连接到 pyqtgraph 绘图小部件

Matplotlib 小部件用于由另一个 matplotlib 小部件生成的绘图

小部件 Onclick 不起作用

为啥 Marquee 在小部件中不起作用?

Swift UIView 小部件自动布局不起作用