pyqtgraph 中有没有办法设置一个级别,例如FillBetweenItem?
Is there a way in pyqtgraph to set a level of e.g. a FillBetweenItem?
在我的应用程序中,我有很多来自不同类型的不同 FillBetweenItems,我不想每次都删除并再次绘制所有项目。我想使用 curve1.setData() 和 curve2.setData()。我想为每个 class 设置一个级别:例如class1 的 FillBetweenItem 应始终位于 class2 的 FillBetweenItem 之上。而 Class3 将始终在 class2 下面。有什么我想念的吗?
import pyqtgraph as pg
class RedClass:
def __init__(self, ax = None):
self.ax = ax
self.lowerCurve = None
self.upperCurve = None
self.fillItem = None
def draw(self, ax = None):
pen = pg.mkPen(None)
if self.lowerCurve is None:
self.lowerCurve = self.ax.plot([1,2],[1,1], pen = pen)
else:
self.lowerCurve.setData(x = [1,2], y = [1,1])
if self.upperCurve is None:
self.upperCurve = self.ax.plot([1,2],[3,3], pen = pen)
else:
self.upperCurve.setData(x = [1,2],y = [3,3])
if self.fillItem is None:
self.fillItem = pg.FillBetweenItem(self.lowerCurve, self.upperCurve, brush = pg.mkBrush('r'))
self.ax.addItem(self.fillItem)
class GreenClass:
def __init__(self, ax = None):
self.ax = ax
self.lowerCurve = None
self.upperCurve = None
self.fillItem = None
def draw(self):
pen = pg.mkPen(None)
if self.lowerCurve is None:
self.lowerCurve = self.ax.plot([1.5,2.5],[1.5,1.5], pen = pen)
else:
self.lowerCurve.setData(x =[1.5,2.5], y = [1.5,1.5])
if self.upperCurve is None:
self.upperCurve = self.ax.plot([1.5,2.5],[2.5,2.5], pen = pen)
else:
self.upperCurve.setData(x = [1.5,2.5],y = [2.5,2.5])
if self.fillItem is None:
self.fillItem = pg.FillBetweenItem(self.lowerCurve, self.upperCurve, brush = pg.mkBrush('g'))
self.ax.addItem(self.fillItem)
if __name__ == '__main__':
from PySide2.QtWidgets import QApplication
import sys
app = QApplication(sys.argv)
ax = pg.PlotWidget()
greenOne = GreenClass(ax = ax)
redOne = RedClass(ax = ax)
#time of draw call determines which class is plotted on top
redOne.draw()
greenOne.draw()
ax.show()
sys.exit(app.exec_())
这取决于我是先调用 redOne.draw() 还是先调用 greenOne.draw() 什么颜色会显示在顶部:
有没有办法设置,例如红色 class 的 Fillbetween 项总是在绿色项之上的级别?还是我必须照顾好每一件物品?
您必须设置 ZValue:具有较高 ZValue 的项目将始终位于具有较低 ZValue 的项目之前:
# ...
redOne.draw()
greenOne.draw()
<b>greenOne.fillItem.setZValue(0)
redOne.fillItem.setZValue(1)</b>
ax.show()
# ...
在我的应用程序中,我有很多来自不同类型的不同 FillBetweenItems,我不想每次都删除并再次绘制所有项目。我想使用 curve1.setData() 和 curve2.setData()。我想为每个 class 设置一个级别:例如class1 的 FillBetweenItem 应始终位于 class2 的 FillBetweenItem 之上。而 Class3 将始终在 class2 下面。有什么我想念的吗?
import pyqtgraph as pg
class RedClass:
def __init__(self, ax = None):
self.ax = ax
self.lowerCurve = None
self.upperCurve = None
self.fillItem = None
def draw(self, ax = None):
pen = pg.mkPen(None)
if self.lowerCurve is None:
self.lowerCurve = self.ax.plot([1,2],[1,1], pen = pen)
else:
self.lowerCurve.setData(x = [1,2], y = [1,1])
if self.upperCurve is None:
self.upperCurve = self.ax.plot([1,2],[3,3], pen = pen)
else:
self.upperCurve.setData(x = [1,2],y = [3,3])
if self.fillItem is None:
self.fillItem = pg.FillBetweenItem(self.lowerCurve, self.upperCurve, brush = pg.mkBrush('r'))
self.ax.addItem(self.fillItem)
class GreenClass:
def __init__(self, ax = None):
self.ax = ax
self.lowerCurve = None
self.upperCurve = None
self.fillItem = None
def draw(self):
pen = pg.mkPen(None)
if self.lowerCurve is None:
self.lowerCurve = self.ax.plot([1.5,2.5],[1.5,1.5], pen = pen)
else:
self.lowerCurve.setData(x =[1.5,2.5], y = [1.5,1.5])
if self.upperCurve is None:
self.upperCurve = self.ax.plot([1.5,2.5],[2.5,2.5], pen = pen)
else:
self.upperCurve.setData(x = [1.5,2.5],y = [2.5,2.5])
if self.fillItem is None:
self.fillItem = pg.FillBetweenItem(self.lowerCurve, self.upperCurve, brush = pg.mkBrush('g'))
self.ax.addItem(self.fillItem)
if __name__ == '__main__':
from PySide2.QtWidgets import QApplication
import sys
app = QApplication(sys.argv)
ax = pg.PlotWidget()
greenOne = GreenClass(ax = ax)
redOne = RedClass(ax = ax)
#time of draw call determines which class is plotted on top
redOne.draw()
greenOne.draw()
ax.show()
sys.exit(app.exec_())
这取决于我是先调用 redOne.draw() 还是先调用 greenOne.draw() 什么颜色会显示在顶部:
有没有办法设置,例如红色 class 的 Fillbetween 项总是在绿色项之上的级别?还是我必须照顾好每一件物品?
您必须设置 ZValue:具有较高 ZValue 的项目将始终位于具有较低 ZValue 的项目之前:
# ...
redOne.draw()
greenOne.draw()
<b>greenOne.fillItem.setZValue(0)
redOne.fillItem.setZValue(1)</b>
ax.show()
# ...