Beispiel #1
0
    def __init__(self, display, axes, data=None, names=None, **kwargs):
        self.display = display

        axisItems = {}
        o = self.axisOrientation
        for n, a in enumerate(axes[:2]):
            a.setOrientation(o[n])
            axisItems[o[n]] = a
            a.setPen()  # update colour theme
        pgPlotWidget.__init__(self, axisItems=axisItems)
        PyqtgraphgDisplayBase.__init__(self)
        DisplayWidget.__init__(self, **kwargs)

        self.view = self.getPlotItem()

        self.addLegend()
        self.curves = []
        # this is mostly used for fast and easy access to all curve values
        # within the Automatic-script:
        self.data = ProxyList()

        if names is not None and data is not None:
            #ADD MULTIPLE LAYERS
            if names is None:
                c = len(data)
                names = [None] * c
            else:
                c = len(names)
            if data is None:
                data = [None] * c
            for i, (d, n) in enumerate(zip(data, names)):

                self.addLayer(n, d, pen=(i, c))

        #UPDATE CURVE NAMES:
        display.stack.sigLayerNameChanged.connect(
            lambda index, txt, self=self: self.curves[index].label.setText(txt
                                                                           ))
Beispiel #2
0
    def __init__(self, display, axes, data=None, names=None, **kwargs):
        self.display = display

        axisItems = {}
        o = self.axisOrientation
        for n, a in enumerate(axes[:2]):
            a.setOrientation(o[n])
            axisItems[o[n]] = a
            a.setPen()  # update colour theme
        pgPlotWidget.__init__(self, axisItems=axisItems)
        PyqtgraphgDisplayBase.__init__(self)
        DisplayWidget.__init__(self, **kwargs)

        self.view = self.getPlotItem()

        self.addLegend()
        self.curves = []
        # this is mostly used for fast and easy access to all curve values
        # within the Automatic-script:
        self.data = ProxyList()

        if names is not None and data is not None:
            # ADD MULTIPLE LAYERS
            if names is None:
                c = len(data)
                names = [None] * c
            else:
                c = len(names)
            if data is None:
                data = [None] * c
            for i, (d, n) in enumerate(zip(data, names)):

                self.addLayer(n, d, pen=(i, c))

        # UPDATE CURVE NAMES:
        display.stack.sigLayerNameChanged.connect(
            lambda index, txt, self=self: self.curves[index].label.setText(txt))
Beispiel #3
0
class PlotWidget(DisplayWidget, pgPlotWidget, PyqtgraphgDisplayBase):
    dimensions = (1, 2)
    axisOrientation = ['bottom', 'left']
    icon = 'trend.svg'

    def __init__(self, display, axes, data=None, names=None, **kwargs):
        self.display = display

        axisItems = {}
        o = self.axisOrientation
        for n, a in enumerate(axes[:2]):
            a.setOrientation(o[n])
            axisItems[o[n]] = a
            a.setPen()  # update colour theme
        pgPlotWidget.__init__(self, axisItems=axisItems)
        PyqtgraphgDisplayBase.__init__(self)
        DisplayWidget.__init__(self, **kwargs)

        self.view = self.getPlotItem()

        self.addLegend()
        self.curves = []
        # this is mostly used for fast and easy access to all curve values
        # within the Automatic-script:
        self.data = ProxyList()

        if names is not None and data is not None:
            # ADD MULTIPLE LAYERS
            if names is None:
                c = len(data)
                names = [None] * c
            else:
                c = len(names)
            if data is None:
                data = [None] * c
            for i, (d, n) in enumerate(zip(data, names)):

                self.addLayer(n, d, pen=(i, c))

        # UPDATE CURVE NAMES:
        display.stack.sigLayerNameChanged.connect(
            lambda index, txt, self=self: self.curves[index].label.setText(txt))

    @staticmethod
    def getNLayers(data):
        s = data.shape
        l = data.ndim
        if l == 1:
            return s[0]
        if l == 2:
            return s[0]
        return 0

    def saveState(self):
        state = DisplayWidget.saveState(self)
        state['view'] = self.view.vb.getState()
        state['layerNames'] = [c.label.text for c in self.curves]
        for n, c in enumerate(self.curves):
            state['%i_x' % n] = c.xData
            state['%i_y' % n] = c.yData
        return state

    def restoreState(self, state):
        self.clear()

        self.view.vb.setState(state['view'])
        names = state['layerNames']
        # DATA
        for n, name in enumerate(names):
            x, y = state['%i_x' % n], state['%i_y' % n]
            self.addLayer(name, data=(x, y))

        DisplayWidget.restoreState(self, state)


#
#     def save(self, session, path):
#         l = {}
#         l['view'] = self.view.vb.getState()
#         l['layerNames'] = [c.label.text for c in self.curves]
#         session.addContentToSave(l, *path+('widget.txt',))
#         #DATA
#         p = session.createSavePath(*path+('data',''))
#
#         def saveInThread():
#             for n, c in enumerate(self.curves):
#                 np.save(p.join('%s.npy'%n),[c.xData, c.yData])
#
#         #this one can take time, so:
#         session.saveThread.tasks.append(saveInThread)
#
#         DisplayWidget.save(self, session, path)
#
#
#     def restore(self, session, path):
#         self.clear()
#
#         l =  eval(session.getSavedContent(*path+('widget.txt',)) )
#         self.view.vb.setState(l['view'])
#         names = l['layerNames']
#         #DATA
#         for n, name in enumerate(names):
#             data = np.load(session.getSavedFile(*path+('data/%s.npy' %n,)))
#             self.addLayer(name, data=tuple(data))
#
#         DisplayWidget.restore(self, session, path)

    def clear(self):
        for i in range(len(self.curves)):
            self.removeLayer(i)

    def close(self):
        self.clear()  # free memory
        try:
            pgPlotWidget.close(self)
        except TypeError:
            pass

    def getData(self, index=None):
        '''
        return listOf(x_vals, v_vals)
        '''
        if index is None:
            return self.data
        return self.data[index]

    def removeLayer(self, index, toMove=False):
        c = self.curves.pop(index)
        self.data.pop(index)
        if toMove:
            self._movedCurve = c

        self.view.legend.removeItem(c.label.text)
        self.removeItem(c)

    def insertLayer(self, index, name, data=None, **kwargs):
        if 'pen' not in kwargs:
            kwargs['pen'] = (len(self.curves) % 10)
        plotItem = self.plot(name=name, **kwargs)
        if data is not None:
            # this should word, but doesn't
            #             if isinstance(data,_PlotData):
            # working but uncool workaround:
            if data.__class__.__name__.endswith('_PlotData'):

                p = data
                x, y = p.item.xData, p.item.yData
            else:
                if type(data) in (tuple, list):
                    x = data[0]
                    y = data[1]
                elif isinstance(data, np.ndarray) and len(data.shape) == 2:
                    x = data[:, 0]
                    y = data[:, 1]
                else:
                    y = data
                    x = list(range(len(data)))

                p = _PlotData(plotItem)
            plotItem.setData(x, y)
        else:
            p = _PlotData(plotItem)
        self.data.append(p)

        self.curves.insert(index, plotItem)
        plotItem.label = self.plotItem.legend.getLabel(plotItem)
        return plotItem  # weakref.proxy(plotItem)

    def insertMovedLayer(self, index):
        self.addItem(self._movedCurve, params={})
        self.curves.insert(index, self._movedCurve)
        del self._movedCurve

    def addLayer(self, name='unnamed', data=None, index=None, **kwargs):
        if index is None:
            index = len(self.curves)
        return self.insertLayer(index, name, data, **kwargs)

    def update(self, data=None, index=None, label=None, **kwargs):
        if data is not None:
            if data is self.data:  # own plotdata
                return
            if index is not None:
                if isinstance(data, _PlotData):
                    x = data.item.xData
                    y = data.item.yData
                else:
                    x, y = data[0], data[1]
                self.curves[index].xData = x
                self.curves[index].yData = y
                self.data[index].changed = True
                if label is not None:
                    self.curves[index].label.setText(label)
            else:
                l = len(data)
                for n, d in enumerate(data):

                    if isinstance(data, _PlotData):
                        x = data.item.xData
                        y = data.item.yData
                    else:
                        x, y = d[0], d[1]
                    try:
                        c = self.curves[n]
                        c.xData = x
                        c.yData = y
                        self.data[n].changed = True
                    except IndexError:
                        self.addLayer(data=(x, y), pen=(n, l))
                    if label is not None:
                        self.curves[n].label.setText(label[n])

    def updateView(self, force=False):
        for n, d in enumerate(self.data):

            if d.changed:
                # ensure that updateItems gets the new x and yData:
                self.curves[n].xDisp = None

                self.curves[n].updateItems()
                d.changed = False