Source code for lib5c.tools.boxplot
from lib5c.tools.parents import simple_in_out_parser, parallelization_parser, \
region_parser, primerfile_parser
[docs]def add_boxplot_tool(parser):
boxplot_parser = parser.add_parser(
'boxplot',
prog='lib5c plot boxplot',
help='plot boxplot of counts at each locus',
parents=[primerfile_parser, simple_in_out_parser, region_parser,
parallelization_parser]
)
boxplot_parser.add_argument(
'-S', '--sorted', action='store_true', help='''Sort the loci by
median.''')
boxplot_parser.add_argument(
'-L', '--logged', action='store_true', help='''Log counts before drawing
the boxplots.''')
boxplot_parser.add_argument(
'-y', '--y_limits', type=str, help='''Set the y-limits of the boxplots
manually by passing a string of the form '(min, max)'.''')
boxplot_parser.add_argument(
'-c', '--color', type=str, default='darkgray', help='''Set the color of
the boxes. The default is 'darkgray'.''')
boxplot_parser.add_argument(
'-m', '--median_color', type=str, default='firebrick', help='''Set the
color of the medians. The default is 'firebrick'.''')
boxplot_parser.add_argument(
'-w', '--median_linewidth', type=float, default=5.0, help='''Set the
thickness of the medians. The default is 5.0''')
boxplot_parser.add_argument(
'-d', '--dpi', type=int, default=300, help='''Specify the DPI at which
to draw the figure. The default is 300.''')
boxplot_parser.add_argument(
'-s', '--scaling_factor', type=float, default=0.05, help='''Specify a
scaling factor to use to automatically determine the figure size. The
default is 0.05''')
boxplot_parser.add_argument(
'-f', '--figure_size', type=str, help='''Specify the size of the figure
in inches as a string literal of the form '(width, height)'.''')
boxplot_parser.set_defaults(func=boxplot_tool)
[docs]def boxplot_tool(parser, args):
from lib5c.tools.helpers import resolve_primerfile, resolve_parallel
from lib5c.parsers.primers import load_primermap
from lib5c.parsers.counts import load_counts
from lib5c.plotters.boxplots import plot_regional_locus_boxplot
# resolve parallel and primerfile
resolve_parallel(parser, args, subcommand='plot boxplot')
primerfile = resolve_primerfile(args.infile, args.primerfile)
# load counts
print('loading counts')
primermap = load_primermap(primerfile)
counts = load_counts(args.infile, primermap)
print('preparing to plot')
# resolve region
if args.region is not None:
counts = counts[args.region]
# resolve outfile
if args.region:
resolved_outfile = args.outfile
else:
resolved_outfile = {region: args.outfile.replace(r'%r', region)
for region in counts.keys()}
# resolve figure_size
figsize = list(map(float, args.figure_size.strip('()').split(','))) \
if args.figure_size else None
# resolve y_limits
ylim = list(map(float, args.y_limits.strip('()').split(','))) \
if args.y_limits else None
# plot boxplot
print('plotting')
plot_regional_locus_boxplot(
counts, color=args.color, median_color=args.median_color,
median_linewidth=args.median_linewidth, logged=args.logged,
sort=args.sorted, figsize=figsize, scaling_factor=args.scaling_factor,
ylim=ylim, dpi=args.dpi, outfile=resolved_outfile)