Пример #1
0
    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()
Пример #3
0
    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()
Пример #5
0
    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 __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)
Пример #10
0
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)