我试着用对数刻度实现可点击的多重绘图。因为我想点击这些情节,所以我使用了PlotCurveItem()和addItem,而不是仅仅使用plot()。但不幸的是,如果我将SetLogMode与PlotCurveItem()结合使用,x轴和y轴将具有几乎无限的值(在现实中是它不以对数显示。)。当我使用地块()时,这样的问题不会发生。
有解决办法吗?或者你知道其他实现对数比例可点击多重绘图的好方法吗?谢谢。
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)
发布于 2021-02-01 11:34:10
问题与对策
这里有很多问题。
问题
Plot
小部件的规模时,它不会更新PlotCurveItem
上的数据。然后你有同样的曲线,但有一个错误的轴比例。当您使用plot()
时,它可以工作,因为它创建了一个PlotDataItem
而不是一个PlotCurveItem
,下面我将解释更多关于这个问题的内容。解决方案1 (不方便)
getData()
中创建一个类似于PlotDataItem的医生的函数,以获取数据,将其转换为日志/线性模式,然后在每次更改刻度时再次将数据设置为PlotCurveItem
。这可能会很混乱。解决方案2 (更方便)
PlotDataItem
,因为它生成一个PlotCurveItem
作为其中的一部分(请阅读以下内容:PlotCurveItem的医生和PlotDataItem的医生)。当您更改比例时,此PlotDataItem
将更新绘图的数据。因为这就是它的工作原理。如果你想知道比例的变化是如何工作的,我建议你读PlotDataItem的源代码。要实现这一点,您可以使用以下方法创建您的地块: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中设置曲线项的可点击属性,如下所示:curve_1.curve.setClickable(True)
curve_2.curve.setClickable(True)
sigClicked
发出的信号( PlotCurveItem
):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,但它必须同样工作。这是我的代码:
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_())
https://stackoverflow.com/questions/65935804
复制相似问题