コード例 #1
0
class Plotter:
    """ This class communicates with the matplotlib library
    and plot the data

    """
    def __init__(self, size):
        """Initialize the plot window, size defines the shape and size
        of the figure
        0 - None, 
        1 - 8x6, 
        11 (default) - 12x8,
        2 - 2 figs 8x8,
        12 - 2 figs 12x8

        """

        #        print('ok')
        class CustomViewBox(pg.ViewBox):
            def __init__(self, *args, **kwds):
                pg.ViewBox.__init__(self, *args, **kwds)
                self.setMouseMode(self.RectMode)

            ## reimplement right-click to zoom out
            def mouseClickEvent(self, ev):
                if ev.button(
                ) == QtCore.Qt.RightButton and QtGui.QApplication.keyboardModifiers(
                ) == QtCore.Qt.ControlModifier:
                    self.autoRange()
                else:
                    pg.ViewBox.mouseClickEvent(self, ev)

            def mouseDragEvent(self, ev):
                mod = QtGui.QApplication.keyboardModifiers()
                if mod == QtCore.Qt.ControlModifier:
                    self.setMouseMode(self.PanMode)
                else:
                    self.setMouseMode(self.RectMode)

                if ev.button() == QtCore.Qt.RightButton:
                    pg.ViewBox.mouseDragEvent(self, ev)
                else:
                    pg.ViewBox.mouseDragEvent(self, ev)

        self.vb = CustomViewBox()
# not necessary?    def clear(self):

    def ylog(self):
        """
           Change y-scale to log
        """
        vr = self._widget.plotItem.viewRange()
        xr = vr[0]
        yr = vr[1]
        #        print(xr,yr)
        if yr[0] <= 0:
            yr[0] = 1
        yr[0] = np.log10(yr[0])
        yr[1] = np.log10(yr[1])
        #        print(xr,yr)
        self._widget.plotItem.disableAutoRange()
        self._widget.plotItem.setLogMode(x=False, y=True)
        self._widget.plotItem.setRange(xRange=xr, yRange=yr, padding=None)

    def ylin(self):
        """
           Change y-scale to linear
        """
        vr = self._widget.plotItem.viewRange()
        xr = vr[0]
        yr = vr[1]
        #        print(xr,yr)
        yr[0] = 10**yr[0]
        yr[1] = 10**yr[1]
        #        print(xr,yr)
        self._widget.plotItem.disableAutoRange()
        self._widget.plotItem.setLogMode(x=False, y=False)
        self._widget.plotItem.setRange(xRange=xr, yRange=yr, padding=None)

    def plot1d(self, plot, xlim=None, ylim=None):
        """ Plot 1D histogram
            The mode defines the way the data are presented,
            'histogram' is displayed with steps
            'function' with continuus line
            'errorbar' with yerrorbars

            The norm (normalization factor) and bin_size are given
            for the display purposes only. The histogram is not altered.

        """

        histo = plot.histogram

        self._widget = PlotWidget(viewBox=self.vb)
        plt = self._widget.plotItem
        plt.setTitle(histo.title)
        plt.plot(histo.x_axis, histo.weights)
        self._widget.show()
#        if plot.mode == 'histogram':
#            current_plot.plot()
#        win.show()
#        app.processEvents()

    def _repr_png_(self):

        self._widget.hide()

        QtGui.QApplication.processEvents()

        try:
            self.image = QImage(self._widget.viewRect().size().toSize(),
                                QImage.Format_RGB32)
        except AttributeError:
            self._widget.updateGL()
            self.image = self._widget.grabFrameBuffer()

        painter = QPainter(self.image)
        self._widget.render(painter)

        byte_array = QByteArray()
        buffer = QBuffer(byte_array)
        buffer.open(QIODevice.ReadWrite)
        self.image.save(buffer, 'PNG')
        buffer.close()

        return bytes(byte_array)

    def xlim(self, x_range):
        """
        Set x range of plot preserving y limits.
        """

        if x_range == None:
            yar = self._widget.plotItem.getViewBox().autoRangeEnabled()[1]
            if yar == False:
                yr = self._widget.viewRange()[1]
            else:
                yr = None
#            self._widget.plotItem.autoRange()
            self._widget.plotItem.enableAutoRange()
            self._widget.plotItem.setAutoVisible(x=True, y=True)
            if yr != None:
                self._widget.plotItem.setRange(yRange=yr, padding=None)
            return None
        else:
            if x_range[0] == None:
                x_range[0] = 0
            if x_range[1] == None:
                self._widget.plotItem.setAutoVisible(x=True, y=False)
                xr = self._widget.viewRange()[0]
                x_range[1] = xr[1]
            self._widget.plotItem.setXRange(x_range[0], x_range[1])
            self._widget.plotItem.setAutoVisible(x=False, y=True)

    def ylim(self, y_range):
        """
        Set y range of plot preserving x limits.
        """
        if y_range == None:
            xar = self._widget.plotItem.getViewBox().autoRangeEnabled()[0]
            if xar == False:
                xr = self._widget.viewRange()[0]
            else:
                xr = None
            self._widget.plotItem.enableAutoRange()
            self._widget.plotItem.setAutoVisible(x=True, y=True)
            if xr != None:
                self._widget.plotItem.setRange(xRange=xr, padding=None)

            return None
        else:
            if y_range[0] == None:
                y_range[0] = 0
            if y_range[1] == None:
                self._widget.plotItem.setAutoVisible(y=True, x=False)
                yr = self._widget.viewRange()[1]
                y_range[1] = yr[1]
            self._widget.plotItem.setYRange(y_range[0], y_range[1])
            self._widget.plotItem.setAutoVisible(y=False, x=True)

#    def plot1d_4panel(self, plot, ranges):
        """
        Special 1D histogram plot. The plot is broken into 4 panels (stacked verically)
        the ranges variable should be given in a (x0, x1, x2, x3, x4) format, where
        xi defines the ranges of the subplots (x0-x1, x1-x2, x2-x3, x3-x4)

        """
    def plot2d(self, plot, xc=None, yc=None, logz=False):
        """Plot 2D histogram 
        xc is x range, yc is y range 
   	"""

        if plot.histogram.dim != 2:
            raise GeneralError('plot2d function needs a 2D histogram!')
        x = plot.histogram.x_axis
        y = plot.histogram.y_axis
        w = plot.histogram.weights

        if xc is not None:
            x = x[xc[0]:xc[1]]
            w = w[xc[0]:xc[1], :]

        if yc is not None:
            y = y[yc[0]:yc[1]]
            w = w[:, yc[0]:yc[1]]

        title = plot.histogram.title
        # If logaritmic scale is used, mask values <= 0
        if logz:
            w = numpy.ma.masked_where(w <= 0, numpy.log10(w))
            title += ' (log10)'

        self._widget = pg.ImageView(view=pg.PlotItem(title=title))
        gv = self._widget.getView()
        gv.invertY(False)
        self._widget.setImage(w, pos=[x[0] - 0.5, y[0] - 0.5])
        self._widget.show()
コード例 #2
0
ファイル: plotter.py プロジェクト: ntbrewer/Pyspeqtr
class Plotter:
    """ This class communicates with the matplotlib library
    and plot the data

    """

    def __init__(self, size):
        """Initialize the plot window, size defines the shape and size
        of the figure
        0 - None, 
        1 - 8x6, 
        11 (default) - 12x8,
        2 - 2 figs 8x8,
        12 - 2 figs 12x8

        """
#        print('ok')
        class CustomViewBox(pg.ViewBox):
           def __init__(self, *args, **kwds):
               pg.ViewBox.__init__(self, *args, **kwds)
               self.setMouseMode(self.RectMode)
        
            ## reimplement right-click to zoom out
           def mouseClickEvent(self, ev):
               if ev.button() == QtCore.Qt.RightButton and QtGui.QApplication.keyboardModifiers()==QtCore.Qt.ControlModifier:
                   self.autoRange()
               else:
                   pg.ViewBox.mouseClickEvent(self, ev)
            
           def mouseDragEvent(self, ev):
               mod = QtGui.QApplication.keyboardModifiers()
               if mod == QtCore.Qt.ControlModifier:
                   self.setMouseMode(self.PanMode)
               else:
                   self.setMouseMode(self.RectMode)
               
               if ev.button() == QtCore.Qt.RightButton:
                   pg.ViewBox.mouseDragEvent(self, ev)
               else:
                   pg.ViewBox.mouseDragEvent(self, ev)

        self.vb = CustomViewBox()
# not necessary?    def clear(self):

    def ylog(self):
        """
           Change y-scale to log
        """
        vr = self._widget.plotItem.viewRange()
        xr = vr[0]
        yr = vr[1]
#        print(xr,yr)
        if yr[0]<=0:
            yr[0]=1
        yr[0]=np.log10(yr[0])
        yr[1]=np.log10(yr[1])
#        print(xr,yr)
        self._widget.plotItem.disableAutoRange()
        self._widget.plotItem.setLogMode(x=False, y=True)
        self._widget.plotItem.setRange(xRange=xr, yRange=yr,padding=None)

    def ylin(self):
        """
           Change y-scale to linear
        """
        vr = self._widget.plotItem.viewRange()
        xr = vr[0]
        yr = vr[1]
#        print(xr,yr)
        yr[0]=10**yr[0]
        yr[1]=10**yr[1]
#        print(xr,yr)
        self._widget.plotItem.disableAutoRange()
        self._widget.plotItem.setLogMode(x=False, y=False)
        self._widget.plotItem.setRange(xRange=xr, yRange=yr,padding=None)

    def plot1d(self, plot, xlim=None, ylim=None):
        """ Plot 1D histogram
            The mode defines the way the data are presented,
            'histogram' is displayed with steps
            'function' with continuus line
            'errorbar' with yerrorbars

            The norm (normalization factor) and bin_size are given
            for the display purposes only. The histogram is not altered.

        """

        histo = plot.histogram

        self._widget = PlotWidget(viewBox=self.vb)
        plt = self._widget.plotItem
        plt.setTitle(histo.title)
        plt.plot(histo.x_axis, histo.weights)
        self._widget.show()
#        if plot.mode == 'histogram':
#            current_plot.plot()
#        win.show()
#        app.processEvents()

    def _repr_png_(self):

        self._widget.hide()

        QtGui.QApplication.processEvents()
        
        try:
            self.image = QImage(self._widget.viewRect().size().toSize(),
                                QImage.Format_RGB32)
        except AttributeError:
            self._widget.updateGL()
            self.image = self._widget.grabFrameBuffer()
            
        painter = QPainter(self.image)
        self._widget.render(painter)

        byte_array = QByteArray()
        buffer = QBuffer(byte_array)
        buffer.open(QIODevice.ReadWrite)
        self.image.save(buffer, 'PNG')
        buffer.close()        

        return bytes(byte_array)

    def xlim(self, x_range):
        """
        Set x range of plot preserving y limits.
        """

        if x_range==None:
            yar=self._widget.plotItem.getViewBox().autoRangeEnabled()[1]
            if yar==False:
                yr=self._widget.viewRange()[1]
            else:
                yr=None
#            self._widget.plotItem.autoRange()
            self._widget.plotItem.enableAutoRange()
            self._widget.plotItem.setAutoVisible(x=True,y=True)
            if yr!=None:
                self._widget.plotItem.setRange(yRange=yr,padding=None)
            return None
        else:
            if x_range[0]==None:
               x_range[0]=0
            if x_range[1]==None:
               self._widget.plotItem.setAutoVisible(x=True,y=False)
               xr=self._widget.viewRange()[0]
               x_range[1]=xr[1]            
            self._widget.plotItem.setXRange(x_range[0],x_range[1])
            self._widget.plotItem.setAutoVisible(x=False,y=True)

    def ylim(self, y_range):
        """
        Set y range of plot preserving x limits.
        """
        if y_range==None:
            xar=self._widget.plotItem.getViewBox().autoRangeEnabled()[0]
            if xar==False:
                xr=self._widget.viewRange()[0]
            else:
                xr=None
            self._widget.plotItem.enableAutoRange()
            self._widget.plotItem.setAutoVisible(x=True,y=True)
            if xr!=None:
                self._widget.plotItem.setRange(xRange=xr,padding=None)

            return None
        else:
            if y_range[0]==None:
               y_range[0]=0
            if y_range[1]==None:
               self._widget.plotItem.setAutoVisible(y=True,x=False)
               yr=self._widget.viewRange()[1]
               y_range[1]=yr[1]            
            self._widget.plotItem.setYRange(y_range[0],y_range[1])
            self._widget.plotItem.setAutoVisible(y=False,x=True)


#    def plot1d_4panel(self, plot, ranges):
        """
        Special 1D histogram plot. The plot is broken into 4 panels (stacked verically)
        the ranges variable should be given in a (x0, x1, x2, x3, x4) format, where
        xi defines the ranges of the subplots (x0-x1, x1-x2, x2-x3, x3-x4)

        """
        
    def plot2d(self, plot, xc=None, yc=None, logz=False):
        """Plot 2D histogram 
        xc is x range, yc is y range 
   	"""     


        if plot.histogram.dim != 2:
            raise GeneralError('plot2d function needs a 2D histogram!')
        x = plot.histogram.x_axis
        y = plot.histogram.y_axis
        w = plot.histogram.weights

        if xc is not None:
            x = x[xc[0]:xc[1]]
            w = w[xc[0]:xc[1],:]

        if yc is not None:
            y = y[yc[0]:yc[1]]
            w = w[:, yc[0]:yc[1]]

        title = plot.histogram.title
        # If logaritmic scale is used, mask values <= 0
        if logz:
            w = numpy.ma.masked_where(w <= 0, numpy.log10(w))
            title += ' (log10)'

        self._widget = pg.ImageView(view=pg.PlotItem(title=title))
        gv = self._widget.getView()
        gv.invertY(False)
        self._widget.setImage(w,pos=[x[0]-0.5,y[0]-0.5])
        self._widget.show()