首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PlotCurveItem和SetLogMode的问题

PlotCurveItem和SetLogMode的问题
EN

Stack Overflow用户
提问于 2021-01-28 11:02:40
回答 1查看 393关注 0票数 0

我试着用对数刻度实现可点击的多重绘图。因为我想点击这些情节,所以我使用了PlotCurveItem()和addItem,而不是仅仅使用plot()。但不幸的是,如果我将SetLogMode与PlotCurveItem()结合使用,x轴和y轴将具有几乎无限的值(在现实中是它不以对数显示。)。当我使用地块()时,这样的问题不会发生。

有解决办法吗?或者你知道其他实现对数比例可点击多重绘图的好方法吗?谢谢。

代码语言:javascript
代码运行次数:0
运行
复制
app = QtGui.QApplication([])
w = pg.GraphicsLayoutWidget(show=True)
w.resize(800,800)

p1 = w.addPlot(0, 0, title="p1")
p1.setLogMode(True,True)

temp_curve = pg.PlotCurveItem(y=2*x,
                              pen=pg.mkPen(pg.mkColor(str(color[0]))),
                              width=4, clickable=True)

temp_curve2 = pg.PlotCurveItem(y=3*x,
                              pen=pg.mkPen(pg.mkColor(str(color[1]))),
                              width=4, clickable=True)

p1.addItem(temp_curve)
p1.addItem(temp_curve2)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-01 19:34:10

问题与对策

这里有很多问题。

问题

  • 当您更改Plot小部件的规模时,它不会更新PlotCurveItem上的数据。然后你有同样的曲线,但有一个错误的轴比例。当您使用plot()时,它可以工作,因为它创建了一个PlotDataItem而不是一个PlotCurveItem,下面我将解释更多关于这个问题的内容。

解决方案1 (不方便)

  • getData()中创建一个类似于PlotDataItem的医生的函数,以获取数据,将其转换为日志/线性模式,然后在每次更改刻度时再次将数据设置为PlotCurveItem。这可能会很混乱。

解决方案2 (更方便)

  • 您可以使用PlotDataItem,因为它生成一个PlotCurveItem作为其中的一部分(请阅读以下内容:PlotCurveItem的医生PlotDataItem的医生)。当您更改比例时,此PlotDataItem将更新绘图的数据。因为这就是它的工作原理。如果你想知道比例的变化是如何工作的,我建议你读PlotDataItem的源代码。要实现这一点,您可以使用以下方法创建您的地块:
代码语言:javascript
代码运行次数:0
运行
复制
curve_1 = pg.PlotDataItem(
    x, y1, pen=pg.mkPen(pg.mkColor((70,70,30))),
    width=4 # , clickable = True   <-- This don't work
    )
curve_2 = pg.PlotDataItem(
    x, y2, pen=pg.mkPen(pg.mkColor((70,70,70))),
    width=4 # , clickable = True   <-- This don't work
    )

解2的问题(及其解)

  • 现在出现了一个新的问题,这个PlotDataItem有一个小错误。它在点击时有信号,但从不激活在其中创建的PlotCurveItem的"clickable“属性。尽管传递了clickable = True参数,但当单击绘图时,这将导致您永远得不到响应。
  • 我们可以做很多事情来解决这个问题,最好的和通用的解决方案将涉及到在__init__()构建器PlotDataItem()中的一次大的返工。但是考虑到您想要实现具有对数比例的可点击多个图,我们可以强制它是可点击的。为此,我们必须在PlotDataItem中设置曲线项的可点击属性,如下所示:
代码语言:javascript
代码运行次数:0
运行
复制
curve_1.curve.setClickable(True)
curve_2.curve.setClickable(True)
  • 现在,您可以按以下方式连接由sigClicked发出的信号( PlotCurveItem ):
代码语言:javascript
代码运行次数:0
运行
复制
curve_1.sigClicked.connect(curve_1_clicked)
curve_2.sigClicked.connect(curve_2_clicked)

def curve_1_clicked(ev):
    print('Curve 1 clicked')
    ## Do more things...

def curve_1_clicked(ev):
    print('Curve 2 clicked')
    ## Do more things...

我用与您不同的代码测试它,使用PlotWidget和使用对象来构建GUI,但它必须同样工作。这是我的代码:

代码语言:javascript
代码运行次数:0
运行
复制
import sys
import pyqtgraph as pg
import numpy as np
from PyQt5 import QtWidgets

class MyApp(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        lay = QtWidgets.QVBoxLayout()
        self.setLayout(lay)
        self.glw = pg.PlotWidget(show=True)
        lay.addWidget(self.glw)
        x = np.arange(100)
        y1 = 2*x
        y2 = 3*x**3
        self.curve_1 = pg.PlotDataItem(
            x, y1, pen=pg.mkPen(pg.mkColor((70,70,30))),
            width=4 # , clickable = True   <-- This don't work
        )
        self.curve_2 = pg.PlotDataItem(
            x, y2, pen=pg.mkPen(pg.mkColor((70,70,70))),
            width=4 # , clickable = True   <-- This don't work
        )
        self.curve_1.curve.setClickable(True)
        self.curve_2.curve.setClickable(True)
        self.glw.addItem(self.curve_1)
        self.glw.addItem(self.curve_2)
        # self.glw.setLogMode(False,False)
        self.glw.setLogMode(True,True)
        self.curve_1.sigClicked.connect(self.c1click)
        self.curve_2.sigClicked.connect(self.c2click)
        
    def c1click(self, ev):
        print('Curve 1 clicked')
    
    def c2click(self, ev):
        print('Curve 2 clicked')

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_()) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65935804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档