pyqtgraph 交叉小部件绘图不起作用?
Posted
技术标签:
【中文标题】pyqtgraph 交叉小部件绘图不起作用?【英文标题】:pyqtgraph cross widget to plot not working? 【发布时间】:2021-10-15 15:47:22 【问题描述】:我正在尝试添加GraphicsLayoutWidget
和LinearRegionItem
,这两个比例是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 交叉小部件绘图不起作用?的主要内容,如果未能解决你的问题,请参考以下文章