latools/latools.py
def bkg_plot(self, analytes=None, figsize=None, yscale='log',
                 ylim=None, err='stderr', save=True):
        """
        Plot the calculated background.

        Parameters
        ----------
        analytes : str or iterable
            Which analyte(s) to plot.
        figsize : tuple
            The (width, height) of the figure, in inches.
            If None, calculated based on number of samples.
        yscale : str
            'log' (default) or 'linear'.
        ylim : tuple
            Manually specify the y scale.
        err : str
            What type of error to plot. Default is stderr.
        save : bool
            If True, figure is saved.

        Returns
        -------
        fig, ax : matplotlib.figure, matplotlib.axes
        """
        if not hasattr(self, 'bkg'):
            raise ValueError("\nPlease calculate a background before attempting to\n" +
                             "plot it... either:\n" +
                             "   bkg_calc_interp1d\n" +
                             "   bkg_calc_weightedmean\n")

        if analytes is None:
            analytes = self.analytes
        elif isinstance(analytes, str):
            analytes = [analytes]

        if figsize is None:
            if len(self.samples) > 50:
                figsize = (len(self.samples) * 0.15, 5)
            else:
                figsize = (7.5, 5)

        fig = plt.figure(figsize=figsize)

        ax = fig.add_axes([.07, .1, .84, .8])
        
        with self.pbar.set(total=len(analytes), desc='Plotting backgrounds') as prog:
            for a in analytes:
                # draw data points
                ax.scatter(self.bkg['raw'].uTime, self.bkg['raw'].loc[:, a],
                        alpha=0.5, s=3, c=self.cmaps[a],
                        lw=0.5)
                
                # draw STD boxes
                for i, r in self.bkg['summary'].iterrows():
                    x = (r.loc['uTime', 'mean'] - r.loc['uTime', 'std'] * 2,
                        r.loc['uTime', 'mean'] + r.loc['uTime', 'std'] * 2)
                    yl = [r.loc[a, 'mean'] - r.loc[a, err]] * 2
                    yu = [r.loc[a, 'mean'] + r.loc[a, err]] * 2

                    ax.fill_between(x, yl, yu, alpha=0.8, lw=0.5, color=self.cmaps[a], zorder=1)
                prog.update()

        if yscale == 'log':
            ax.set_yscale('log')
        if ylim is not None:
            ax.set_ylim(ylim)
        else:
            ax.set_ylim(ax.get_ylim() * np.array([1, 10]))  # x10 to make sample names readable.

        for a in analytes:
            # draw confidence intervals of calculated
            x = self.bkg['calc']['uTime']
            y = self.bkg['calc'][a]['mean']
            yl = self.bkg['calc'][a]['mean'] - self.bkg['calc'][a][err]
            yu = self.bkg['calc'][a]['mean'] + self.bkg['calc'][a][err]

            # trim values below zero if log scale=    
            if yscale == 'log':
                yl[yl < ax.get_ylim()[0]] = ax.get_ylim()[0]

            ax.plot(x, y,
                    c=self.cmaps[a], zorder=2, label=a)
            ax.fill_between(x, yl, yu,
                            color=self.cmaps[a], alpha=0.3, zorder=-1)

        ax.set_xlabel('Time (s)')
        ax.set_ylabel('Background Counts')

        ax.set_title('Points = raw data; Bars = {:s}; Lines = Calculated Background; Envelope = Background {:s}'.format(err, err),
                     fontsize=10)

        ha, la = ax.get_legend_handles_labels()

        ax.legend(labels=la[:len(analytes)], handles=ha[:len(analytes)], bbox_to_anchor=(1, 1))

        # scale x axis to range ± 2.5%
        xlim = rangecalc(self.bkg['raw']['uTime'], 0.025)
        ax.set_xlim(xlim)

        # add sample labels
        for s, d in self.data.items():
            ax.axvline(d.uTime[0], alpha=0.2, color='k', zorder=-1)
            ax.text(d.uTime[0], ax.get_ylim()[1], s, rotation=90,
                    va='top', ha='left', zorder=-1, fontsize=7)

        if save:
            fig.savefig(self.report_dir + '/background.png', dpi=200)

        return fig, ax
def bkg_plot(self, analytes=None, figsize=None, yscale='log',
                 ylim=None, err='stderr', save=True):
        """
        Plot the calculated background.

        Parameters
        ----------
        analytes : str or iterable
            Which analyte(s) to plot.
        figsize : tuple
            The (width, height) of the figure, in inches.
            If None, calculated based on number of samples.
        yscale : str
            'log' (default) or 'linear'.
        ylim : tuple
            Manually specify the y scale.
        err : str
            What type of error to plot. Default is stderr.
        save : bool
            If True, figure is saved.

        Returns
        -------
        fig, ax : matplotlib.figure, matplotlib.axes
        """
        if not hasattr(self, 'bkg'):
            raise ValueError("\nPlease calculate a background before attempting to\n" +
                             "plot it... either:\n" +
                             "   bkg_calc_interp1d\n" +
                             "   bkg_calc_weightedmean\n")

        if analytes is None:
            analytes = self.analytes
        elif isinstance(analytes, str):
            analytes = [analytes]

        if figsize is None:
            if len(self.samples) > 50:
                figsize = (len(self.samples) * 0.15, 5)
            else:
                figsize = (7.5, 5)

        fig = plt.figure(figsize=figsize)

        ax = fig.add_axes([.07, .1, .84, .8])
        
        with self.pbar.set(total=len(analytes), desc='Plotting backgrounds') as prog:
            for a in analytes:
                # draw data points
                ax.scatter(self.bkg['raw'].uTime, self.bkg['raw'].loc[:, a],
                        alpha=0.5, s=3, c=self.cmaps[a],
                        lw=0.5)
                
                # draw STD boxes
                for i, r in self.bkg['summary'].iterrows():
                    x = (r.loc['uTime', 'mean'] - r.loc['uTime', 'std'] * 2,
                        r.loc['uTime', 'mean'] + r.loc['uTime', 'std'] * 2)
                    yl = [r.loc[a, 'mean'] - r.loc[a, err]] * 2
                    yu = [r.loc[a, 'mean'] + r.loc[a, err]] * 2

                    ax.fill_between(x, yl, yu, alpha=0.8, lw=0.5, color=self.cmaps[a], zorder=1)
                prog.update()

        if yscale == 'log':
            ax.set_yscale('log')
        if ylim is not None:
            ax.set_ylim(ylim)
        else:
            ax.set_ylim(ax.get_ylim() * np.array([1, 10]))  # x10 to make sample names readable.

        for a in analytes:
            # draw confidence intervals of calculated
            x = self.bkg['calc']['uTime']
            y = self.bkg['calc'][a]['mean']
            yl = self.bkg['calc'][a]['mean'] - self.bkg['calc'][a][err]
            yu = self.bkg['calc'][a]['mean'] + self.bkg['calc'][a][err]

            # trim values below zero if log scale=    
            if yscale == 'log':
                yl[yl < ax.get_ylim()[0]] = ax.get_ylim()[0]

            ax.plot(x, y,
                    c=self.cmaps[a], zorder=2, label=a)
            ax.fill_between(x, yl, yu,
                            color=self.cmaps[a], alpha=0.3, zorder=-1)

        ax.set_xlabel('Time (s)')
        ax.set_ylabel('Background Counts')

        ax.set_title('Points = raw data; Bars = {:s}; Lines = Calculated Background; Envelope = Background {:s}'.format(err, err),
                     fontsize=10)

        ha, la = ax.get_legend_handles_labels()

        ax.legend(labels=la[:len(analytes)], handles=ha[:len(analytes)], bbox_to_anchor=(1, 1))

        # scale x axis to range ± 2.5%
        xlim = rangecalc(self.bkg['raw']['uTime'], 0.025)
        ax.set_xlim(xlim)

        # add sample labels
        for s, d in self.data.items():
            ax.axvline(d.uTime[0], alpha=0.2, color='k', zorder=-1)
            ax.text(d.uTime[0], ax.get_ylim()[1], s, rotation=90,
                    va='top', ha='left', zorder=-1, fontsize=7)

        if save:
            fig.savefig(self.report_dir + '/background.png', dpi=200)

        return fig, ax
def bkg_plot ( self , analytes = None , figsize = None , yscale = 'log' , ylim = None , err = 'stderr' , save = True ) : if not hasattr ( self , 'bkg' ) : raise ValueError ( "\nPlease calculate a background before attempting to\n" + "plot it... either:\n" + "   bkg_calc_interp1d\n" + "   bkg_calc_weightedmean\n" ) if analytes is None : analytes = self . analytes elif isinstance ( analytes , str ) : analytes = [ analytes ] if figsize is None : if len ( self . samples ) > 50 : figsize = ( len ( self . samples ) * 0.15 , 5 ) else : figsize = ( 7.5 , 5 ) fig = plt . figure ( figsize = figsize ) ax = fig . add_axes ( [ .07 , .1 , .84 , .8 ] ) with self . pbar . set ( total = len ( analytes ) , desc = 'Plotting backgrounds' ) as prog : for a in analytes : # draw data points ax . scatter ( self . bkg [ 'raw' ] . uTime , self . bkg [ 'raw' ] . loc [ : , a ] , alpha = 0.5 , s = 3 , c = self . cmaps [ a ] , lw = 0.5 ) # draw STD boxes for i , r in self . bkg [ 'summary' ] . iterrows ( ) : x = ( r . loc [ 'uTime' , 'mean' ] - r . loc [ 'uTime' , 'std' ] * 2 , r . loc [ 'uTime' , 'mean' ] + r . loc [ 'uTime' , 'std' ] * 2 ) yl = [ r . loc [ a , 'mean' ] - r . loc [ a , err ] ] * 2 yu = [ r . loc [ a , 'mean' ] + r . loc [ a , err ] ] * 2 ax . fill_between ( x , yl , yu , alpha = 0.8 , lw = 0.5 , color = self . cmaps [ a ] , zorder = 1 ) prog . update ( ) if yscale == 'log' : ax . set_yscale ( 'log' ) if ylim is not None : ax . set_ylim ( ylim ) else : ax . set_ylim ( ax . get_ylim ( ) * np . array ( [ 1 , 10 ] ) ) # x10 to make sample names readable. for a in analytes : # draw confidence intervals of calculated x = self . bkg [ 'calc' ] [ 'uTime' ] y = self . bkg [ 'calc' ] [ a ] [ 'mean' ] yl = self . bkg [ 'calc' ] [ a ] [ 'mean' ] - self . bkg [ 'calc' ] [ a ] [ err ] yu = self . bkg [ 'calc' ] [ a ] [ 'mean' ] + self . bkg [ 'calc' ] [ a ] [ err ] # trim values below zero if log scale=     if yscale == 'log' : yl [ yl < ax . get_ylim ( ) [ 0 ] ] = ax . get_ylim ( ) [ 0 ] ax . plot ( x , y , c = self . cmaps [ a ] , zorder = 2 , label = a ) ax . fill_between ( x , yl , yu , color = self . cmaps [ a ] , alpha = 0.3 , zorder = - 1 ) ax . set_xlabel ( 'Time (s)' ) ax . set_ylabel ( 'Background Counts' ) ax . set_title ( 'Points = raw data; Bars = {:s}; Lines = Calculated Background; Envelope = Background {:s}' . format ( err , err ) , fontsize = 10 ) ha , la = ax . get_legend_handles_labels ( ) ax . legend ( labels = la [ : len ( analytes ) ] , handles = ha [ : len ( analytes ) ] , bbox_to_anchor = ( 1 , 1 ) ) # scale x axis to range ± 2.5% xlim = rangecalc ( self . bkg [ 'raw' ] [ 'uTime' ] , 0.025 ) ax . set_xlim ( xlim ) # add sample labels for s , d in self . data . items ( ) : ax . axvline ( d . uTime [ 0 ] , alpha = 0.2 , color = 'k' , zorder = - 1 ) ax . text ( d . uTime [ 0 ] , ax . get_ylim ( ) [ 1 ] , s , rotation = 90 , va = 'top' , ha = 'left' , zorder = - 1 , fontsize = 7 ) if save : fig . savefig ( self . report_dir + '/background.png' , dpi = 200 ) return fig , ax
Plot the calculated background.

        Parameters
        ----------
        analytes : str or iterable
            Which analyte(s) to plot.
        figsize : tuple
            The (width, height) of the figure, in inches.
            If None, calculated based on number of samples.
        yscale : str
            'log' (default) or 'linear'.
        ylim : tuple
            Manually specify the y scale.
        err : str
            What type of error to plot. Default is stderr.
        save : bool
            If True, figure is saved.

        Returns
        -------
        fig, ax : matplotlib.figure, matplotlib.axes
Plot the calculated background .