def addItem(self, item, name): """ Add a new entry to the legend. ============== ======================================================== **Arguments:** item A PlotDataItem from which the line and point style of the item will be determined or an instance of ItemSample (or a subclass), allowing the item display to be customized. title The title to display for this item. Simple HTML allowed. ============== ======================================================== """ # get item color pen = fn.mkPen(item.opts['pen']) color = pen.color() color_str = color.name() #create label with same color label = LabelItem() label.setAttr('color', str(color_str[1:])) label.setText(name) if isinstance(item, ItemSample): sample = item else: sample = ItemSample(item) self.legendItems.append((sample, label)) self.plotItems.append(item) self.layout.addItem(sample, self.numItems, 0) self.layout.addItem(label, self.numItems, 1) self.numItems += 1 self.updateSize()
def addItem(self, item, name): label = LabelItem(name, justify="left", color=[0, 0, 0]) emptyLabel = LabelItem("") if isinstance(item, ItemSample): sample = item else: sample = ItemSample(item) row = self.layout.rowCount() self.items.append((sample, label)) self.layout.addItem(sample, row, 0) self.layout.addItem(emptyLabel, row, 1) self.layout.addItem(label, row, 2) self.updateSize()
def addItem(self, name): """ Add a new entry to the legend. ============== ======================================================== **Arguments:** item A PlotDataItem from which the line and point style of the item will be determined or an instance of ItemSample (or a subclass), allowing the item display to be customized. title The title to display for this item. Simple HTML allowed. ============== ======================================================== """ self.label = LabelItem(name) self.layout.addItem(self.label, 0, 0) self.updateSize()
def LegendItem_addItem(self, item, name): label = LabelItem(name, justify='left', color='000000') if isinstance(item, pyqtgraph.graphicsItems.LegendItem.ItemSample): sample = item else: sample = pyqtgraph.graphicsItems.LegendItem.ItemSample(item) row = self.layout.rowCount() self.items.append((sample, label)) self.layout.addItem(sample, row, 0) self.layout.addItem(label, row, 1) self.updateSize()
def __init__(self, parent=None, axisItems=None, name=None): pg.setConfigOption('background', 'w') pg.setConfigOption('foreground', 'k') super(CoordinatePlotWidget, self).__init__(parent) self.coordinateLabel = LabelItem(justify='right') self._graphicsView = self.addCustomPlot(row=0, col=0, colspan=2, axisItems=axisItems, name=name) self.addItem(self.coordinateLabel, row=1, col=1) self._graphicsView.scene().sigMouseMoved.connect(self.onMouseMoved) self.template = "<span style='font-size: 10pt'>x={0}, <span style='color: red'>y={1}</span></span>" self.mousePoint = None self.mousePointList = list() self._graphicsView.showGrid(x=True, y=True, alpha=grid_opacity) #grid defaults to on action = QtWidgets.QAction("toggle time axis", self._graphicsView.ctrlMenu) action.triggered.connect(self.onToggleTimeAxis) self._graphicsView.ctrlMenu.addAction(action) self.timeAxis = False
def __init__(self, parent=None, axisItems=None, name=None): pg.setConfigOption('background', 'w') pg.setConfigOption('foreground', 'k') super(CoordinatePlotWidget, self).__init__(parent) self.coordinateLabel = LabelItem(justify='right') self._graphicsView = self.addCustomPlot(row=0, col=0, colspan=2, axisItems=axisItems, name=name) self.addItem(self.coordinateLabel, row=1, col=1) self._graphicsView.scene().sigMouseMoved.connect(self.onMouseMoved) self.template = "<span style='font-size: 10pt'>x={0}, <span style='color: red'>y={1}</span></span>" self.mousePoint = None self.mousePointList = list() self._graphicsView.showGrid(x = True, y = True, alpha = grid_opacity) #grid defaults to on action = QtWidgets.QAction("toggle time axis", self._graphicsView.ctrlMenu) action.triggered.connect( self.onToggleTimeAxis ) self._graphicsView.ctrlMenu.addAction(action) self.timeAxis = False
class CoordinatePlotWidget(pg.GraphicsLayoutWidget): """This is the main widget for plotting data. It consists of a plot, a coordinate display, and custom buttons.""" def __init__(self, parent=None, axisItems=None, name=None): pg.setConfigOption('background', 'w') pg.setConfigOption('foreground', 'k') super(CoordinatePlotWidget, self).__init__(parent) self.coordinateLabel = LabelItem(justify='right') self._graphicsView = self.addCustomPlot(row=0, col=0, colspan=2, axisItems=axisItems, name=name) self.addItem(self.coordinateLabel, row=1, col=1) self._graphicsView.scene().sigMouseMoved.connect(self.onMouseMoved) self.template = "<span style='font-size: 10pt'>x={0}, <span style='color: red'>y={1}</span></span>" self.mousePoint = None self.mousePointList = list() self._graphicsView.showGrid(x = True, y = True, alpha = grid_opacity) #grid defaults to on action = QtWidgets.QAction("toggle time axis", self._graphicsView.ctrlMenu) action.triggered.connect( self.onToggleTimeAxis ) self._graphicsView.ctrlMenu.addAction(action) self.timeAxis = False def onToggleTimeAxis(self): self.setTimeAxis( not self.timeAxis ) def setTimeAxis(self, timeAxis=False): if timeAxis: dateAxisItem = DateAxisItem(orientation='bottom') originalAxis = self._graphicsView.getAxis('bottom') dateAxisItem.linkToView(self._graphicsView.vb) self._graphicsView.axes['bottom']['item'] = dateAxisItem self._graphicsView.layout.removeItem(originalAxis) del originalAxis self._graphicsView.layout.addItem(dateAxisItem, 3, 1) self.timeAxis = True dateAxisItem.setZValue(-1000) dateAxisItem.setFlag(dateAxisItem.ItemNegativeZStacksBehindParent) dateAxisItem.linkedViewChanged(self._graphicsView.vb) else: axisItem = AxisItem(orientation='bottom') originalAxis = self._graphicsView.getAxis('bottom') axisItem.linkToView(self._graphicsView.vb) self._graphicsView.axes['bottom']['item'] = axisItem self._graphicsView.layout.removeItem(originalAxis) del originalAxis self._graphicsView.layout.addItem(axisItem, 3, 1) self.timeAxis = False axisItem.setZValue(-1000) axisItem.setFlag(axisItem.ItemNegativeZStacksBehindParent) axisItem.linkedViewChanged(self._graphicsView.vb) def setPrintView(self, printview=True): self._graphicsView.hideAllButtons(printview) if printview: self.coordinateLabel.hide() else: self.coordinateLabel.show() def autoRange(self): """Set the display to autorange.""" self._graphicsView.vb.enableAutoRange(axis=None, enable=True) def addCustomPlot(self, row=None, col=None, rowspan=1, colspan=1, **kargs): """This is a duplicate of addPlot from GraphicsLayout.py. The only change is CustomPlotItem instead of PlotItem.""" plot = CustomPlotItem(**kargs) self.addItem(plot, row, col, rowspan, colspan) return plot def onMouseMoved(self, pos): """Execute when mouse is moved. If mouse is over plot, show cursor coordinates on coordinateLabel.""" if self._graphicsView.sceneBoundingRect().contains(pos): if self.timeAxis: try: self.mousePoint = self._graphicsView.vb.mapSceneToView(pos) logY = self._graphicsView.ctrl.logYCheck.isChecked() y = self.mousePoint.y() if not logY else pow(10, self.mousePoint.y()) vR = self._graphicsView.vb.viewRange() deltaY = vR[1][1]-vR[1][0] if not logY else pow(10, vR[1][1])-pow(10, vR[1][0]) #Calculate x and y display ranges precy = int( math.ceil( math.log10(abs(y/deltaY)) ) + 3 ) if y!=0 and deltaY>0 else 1 roundedy = roundToNDigits(y, precy ) try: currentDateTime = datetime.fromtimestamp(self.mousePoint.x()) self.coordinateLabel.setText( self.template.format( str(currentDateTime), repr(roundedy) )) except OSError: pass # datetime concersion at mouse point failed except ValueError: pass else: try: self.mousePoint = self._graphicsView.vb.mapSceneToView(pos) logY = self._graphicsView.ctrl.logYCheck.isChecked() logX = self._graphicsView.ctrl.logXCheck.isChecked() y = self.mousePoint.y() if not logY else pow(10, self.mousePoint.y()) x = self.mousePoint.x() if not logX else pow(10, self.mousePoint.x()) vR = self._graphicsView.vb.viewRange() deltaY = vR[1][1]-vR[1][0] if not logY else pow(10, vR[1][1])-pow(10, vR[1][0]) #Calculate x and y display ranges deltaX = vR[0][1]-vR[0][0] if not logX else pow(10, vR[0][1])-pow(10, vR[0][0]) precx = int( math.ceil( math.log10(abs(x/deltaX)) ) + 3 ) if x!=0 and deltaX>0 else 1 precy = int( math.ceil( math.log10(abs(y/deltaY)) ) + 3 ) if y!=0 and deltaY>0 else 1 roundedx, roundedy = roundToNDigits( x, precx), roundToNDigits(y, precy ) self.coordinateLabel.setText( self.template.format( repr(roundedx), repr(roundedy) )) except numpy.linalg.linalg.LinAlgError: pass def onCopyLocation(self, which): text = {'x': ("{0}".format(self.mousePoint.x())), 'y': ("{0}".format(self.mousePoint.y())) }.get(which, "{0}, {1}".format(self.mousePoint.x(), self.mousePoint.y())) QtWidgets.QApplication.clipboard().setText(text) # def mouseDoubleClickEvent(self, ev): # pg.GraphicsLayoutWidget.mouseDoubleClickEvent(self,ev) # print "CoordinatePlotWidget mouseDoubleClicked" # #self.onMouseClicked(ev) def copyPointsToClipboard(self, modifiers): logger = logging.getLogger(__name__) logger.debug( "copyPointsToClipboard" ) if modifiers & QtCore.Qt.ControlModifier: if modifiers & QtCore.Qt.ShiftModifier: QtWidgets.QApplication.clipboard().setText(" ".join(["{0}".format(p.x()) for p in self.mousePointList])) elif modifiers & QtCore.Qt.AltModifier: QtWidgets.QApplication.clipboard().setText(" ".join(["{0}".format(p.y()) for p in self.mousePointList])) else: QtWidgets.QApplication.clipboard().setText(" ".join(["{0} {1}".format(p.x(), p.y()) for p in self.mousePointList])) def keyReleaseEvent(self, ev): logger = logging.getLogger(__name__) logger.debug( "Key released {0} {1}".format( ev.key(), ev.modifiers() ) ) { 67: self.copyPointsToClipboard }.get(ev.key(), lambda x:None)(ev.modifiers()) def mouseReleaseEvent(self, ev): pg.GraphicsLayoutWidget.mouseReleaseEvent(self, ev) if ev.modifiers()&QtCore.Qt.ShiftModifier: self.mousePointList.append(self.mousePoint) else: self.mousePointList = [self.mousePoint] def autoRangeEnabled(self): return self._graphicsView.vb.autoRangeEnabled() def enableAutoRange(self, axes=None, enable=True, x=None, y=None): self._graphicsView.vb.enableAutoRange(axes, enable, x, y) def autoRange(self, padding=None, items=None, item=None): self._graphicsView.vb.autoRange(padding, items, item)
class CoordinatePlotWidget(pg.GraphicsLayoutWidget): """This is the main widget for plotting data. It consists of a plot, a coordinate display, and custom buttons.""" def __init__(self, parent=None, axisItems=None, name=None): pg.setConfigOption('background', 'w') pg.setConfigOption('foreground', 'k') super(CoordinatePlotWidget, self).__init__(parent) self.coordinateLabel = LabelItem(justify='right') self._graphicsView = self.addCustomPlot(row=0, col=0, colspan=2, axisItems=axisItems, name=name) self.addItem(self.coordinateLabel, row=1, col=1) self._graphicsView.scene().sigMouseMoved.connect(self.onMouseMoved) self.template = "<span style='font-size: 10pt'>x={0}, <span style='color: red'>y={1}</span></span>" self.mousePoint = None self.mousePointList = list() self._graphicsView.showGrid(x=True, y=True, alpha=grid_opacity) #grid defaults to on action = QtWidgets.QAction("toggle time axis", self._graphicsView.ctrlMenu) action.triggered.connect(self.onToggleTimeAxis) self._graphicsView.ctrlMenu.addAction(action) self.timeAxis = False def onToggleTimeAxis(self): self.setTimeAxis(not self.timeAxis) def setTimeAxis(self, timeAxis=False): if timeAxis: dateAxisItem = DateAxisItem(orientation='bottom') originalAxis = self._graphicsView.getAxis('bottom') dateAxisItem.linkToView(self._graphicsView.vb) self._graphicsView.axes['bottom']['item'] = dateAxisItem self._graphicsView.layout.removeItem(originalAxis) del originalAxis self._graphicsView.layout.addItem(dateAxisItem, 3, 1) self.timeAxis = True dateAxisItem.setZValue(-1000) dateAxisItem.setFlag(dateAxisItem.ItemNegativeZStacksBehindParent) dateAxisItem.linkedViewChanged(self._graphicsView.vb) else: axisItem = AxisItem(orientation='bottom') originalAxis = self._graphicsView.getAxis('bottom') axisItem.linkToView(self._graphicsView.vb) self._graphicsView.axes['bottom']['item'] = axisItem self._graphicsView.layout.removeItem(originalAxis) del originalAxis self._graphicsView.layout.addItem(axisItem, 3, 1) self.timeAxis = False axisItem.setZValue(-1000) axisItem.setFlag(axisItem.ItemNegativeZStacksBehindParent) axisItem.linkedViewChanged(self._graphicsView.vb) def setPrintView(self, printview=True): self._graphicsView.hideAllButtons(printview) if printview: self.coordinateLabel.hide() else: self.coordinateLabel.show() def autoRange(self): """Set the display to autorange.""" self._graphicsView.vb.enableAutoRange(axis=None, enable=True) def addCustomPlot(self, row=None, col=None, rowspan=1, colspan=1, **kargs): """This is a duplicate of addPlot from GraphicsLayout.py. The only change is CustomPlotItem instead of PlotItem.""" plot = CustomPlotItem(**kargs) self.addItem(plot, row, col, rowspan, colspan) return plot def onMouseMoved(self, pos): """Execute when mouse is moved. If mouse is over plot, show cursor coordinates on coordinateLabel.""" if self._graphicsView.sceneBoundingRect().contains(pos): if self.timeAxis: try: self.mousePoint = self._graphicsView.vb.mapSceneToView(pos) logY = self._graphicsView.ctrl.logYCheck.isChecked() y = self.mousePoint.y() if not logY else pow( 10, self.mousePoint.y()) vR = self._graphicsView.vb.viewRange() deltaY = vR[1][1] - vR[1][0] if not logY else pow( 10, vR[1][1]) - pow( 10, vR[1][0]) #Calculate x and y display ranges precy = int(math.ceil(math.log10(abs(y / deltaY))) + 3) if y != 0 and deltaY > 0 else 1 roundedy = roundToNDigits(y, precy) try: currentDateTime = datetime.fromtimestamp( self.mousePoint.x()) self.coordinateLabel.setText( self.template.format(str(currentDateTime), repr(roundedy))) except OSError: pass # datetime concersion at mouse point failed except ValueError: pass else: try: self.mousePoint = self._graphicsView.vb.mapSceneToView(pos) logY = self._graphicsView.ctrl.logYCheck.isChecked() logX = self._graphicsView.ctrl.logXCheck.isChecked() y = self.mousePoint.y() if not logY else pow( 10, self.mousePoint.y()) x = self.mousePoint.x() if not logX else pow( 10, self.mousePoint.x()) vR = self._graphicsView.vb.viewRange() deltaY = vR[1][1] - vR[1][0] if not logY else pow( 10, vR[1][1]) - pow( 10, vR[1][0]) #Calculate x and y display ranges deltaX = vR[0][1] - vR[0][0] if not logX else pow( 10, vR[0][1]) - pow(10, vR[0][0]) precx = int(math.ceil(math.log10(abs(x / deltaX))) + 3) if x != 0 and deltaX > 0 else 1 precy = int(math.ceil(math.log10(abs(y / deltaY))) + 3) if y != 0 and deltaY > 0 else 1 roundedx, roundedy = roundToNDigits(x, precx), roundToNDigits( y, precy) self.coordinateLabel.setText( self.template.format(repr(roundedx), repr(roundedy))) except numpy.linalg.linalg.LinAlgError: pass def onCopyLocation(self, which): text = { 'x': ("{0}".format(self.mousePoint.x())), 'y': ("{0}".format(self.mousePoint.y())) }.get(which, "{0}, {1}".format(self.mousePoint.x(), self.mousePoint.y())) QtWidgets.QApplication.clipboard().setText(text) # def mouseDoubleClickEvent(self, ev): # pg.GraphicsLayoutWidget.mouseDoubleClickEvent(self,ev) # print "CoordinatePlotWidget mouseDoubleClicked" # #self.onMouseClicked(ev) def copyPointsToClipboard(self, modifiers): logger = logging.getLogger(__name__) logger.debug("copyPointsToClipboard") if modifiers & QtCore.Qt.ControlModifier: if modifiers & QtCore.Qt.ShiftModifier: QtWidgets.QApplication.clipboard().setText(" ".join( ["{0}".format(p.x()) for p in self.mousePointList])) elif modifiers & QtCore.Qt.AltModifier: QtWidgets.QApplication.clipboard().setText(" ".join( ["{0}".format(p.y()) for p in self.mousePointList])) else: QtWidgets.QApplication.clipboard().setText(" ".join([ "{0} {1}".format(p.x(), p.y()) for p in self.mousePointList ])) def keyReleaseEvent(self, ev): logger = logging.getLogger(__name__) logger.debug("Key released {0} {1}".format(ev.key(), ev.modifiers())) { 67: self.copyPointsToClipboard }.get(ev.key(), lambda x: None)(ev.modifiers()) def mouseReleaseEvent(self, ev): pg.GraphicsLayoutWidget.mouseReleaseEvent(self, ev) if ev.modifiers() & QtCore.Qt.ShiftModifier: self.mousePointList.append(self.mousePoint) else: self.mousePointList = [self.mousePoint] def autoRangeEnabled(self): return self._graphicsView.vb.autoRangeEnabled() def enableAutoRange(self, axes=None, enable=True, x=None, y=None): self._graphicsView.vb.enableAutoRange(axes, enable, x, y) def autoRange(self, padding=None, items=None, item=None): self._graphicsView.vb.autoRange(padding, items, item)
class IPSimpleLegend(GraphicsWidget, GraphicsWidgetAnchor): def __init__(self, size=None, offset=None): GraphicsWidget.__init__(self) GraphicsWidgetAnchor.__init__(self) self.setFlag(self.ItemIgnoresTransformations) self.layout = QtGui.QGraphicsGridLayout() self.setLayout(self.layout) self.size = size self.offset = offset if size is not None: self.setGeometry(QtCore.QRectF(0, 0, self.size[0], self.size[1])) def setParentItem(self, p): ret = GraphicsWidget.setParentItem(self, p) if self.offset is not None: offset = Point(self.offset) anchorx = 1 if offset[0] <= 0 else 0 anchory = 1 if offset[1] <= 0 else 0 anchor = (anchorx, anchory) self.anchor(itemPos=anchor, parentPos=anchor, offset=offset) return ret def addItem(self, name): """ Add a new entry to the legend. ============== ======================================================== **Arguments:** item A PlotDataItem from which the line and point style of the item will be determined or an instance of ItemSample (or a subclass), allowing the item display to be customized. title The title to display for this item. Simple HTML allowed. ============== ======================================================== """ self.label = LabelItem(name) self.layout.addItem(self.label, 0, 0) self.updateSize() def removeItem(self, item): self.removeItem(self.label) # redraq box def updateSize(self): if self.size is not None: return height = self.label.height() width = self.label.width() self.setGeometry(0, 0, width, height) def boundingRect(self): return QtCore.QRectF(0, 0, self.width(), self.height()) def paint(self, p, *args): p.setPen(fn.mkPen(255, 255, 255, 100)) p.setBrush(fn.mkBrush(100, 100, 100, 80)) # p.drawRect(self.boundingRect()) def hoverEvent(self, ev): ev.acceptDrags(QtCore.Qt.LeftButton) def mouseDragEvent(self, ev): if ev.button() == QtCore.Qt.LeftButton: dpos = ev.pos() - ev.lastPos() self.autoAnchor(self.pos() + dpos)