Mercurial > repos > goeckslab > scimap_phenotyping
diff scimap_plotting.py @ 2:ce22e846c5e4 draft
planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/scimap commit 9fb5578191db8a559191e45156cfb95350f01aea
author | goeckslab |
---|---|
date | Mon, 10 Jun 2024 18:44:25 +0000 |
parents | |
children | 88fca6e905be |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scimap_plotting.py Mon Jun 10 18:44:25 2024 +0000 @@ -0,0 +1,125 @@ +import argparse +import json +import os +import warnings + +import matplotlib.pylab as plt +import numpy as np +import scimap as sm +import seaborn as sns +from anndata import read_h5ad + +sns.set(color_codes=True) + + +def main(inputs, anndata, output): + """ + Parameter + --------- + inputs : str + File path to galaxy tool parameter. + anndata : str + File path to anndata containing phenotyping info. + output : str + File path to output. + """ + warnings.simplefilter('ignore') + + with open(inputs, 'r') as param_handler: + params = json.load(param_handler) + + adata = read_h5ad(anndata) + + tool = params['analyses']['selected_tool'] + options = params['analyses']['options'] + + if tool == 'stacked_barplot': + + # parse list text arguments + for o in options.copy(): + opt_list = options.pop(o) + if opt_list: + options[o] = [x.strip() for x in opt_list.split(',')] + + # add base args into options dict to pass to tool + options['x_axis'] = params['analyses']['x_axis'] + options['y_axis'] = params['analyses']['y_axis'] + options['method'] = params['analyses']['method'] + + options['return_data'] = True + + df = sm.pl.stacked_barplot(adata, **options) + + # Pick cmap to use + num_phenotypes = len(df.columns) - 1 + if num_phenotypes <= 9: + matplotlib_cmap = "Set1" + elif num_phenotypes > 9 and num_phenotypes <= 20: + matplotlib_cmap = plt.cm.tab20 + else: + matplotlib_cmap = plt.cm.gist_ncar + + # Plotting + sns.set_theme(style="white") + ax = df.plot.bar(stacked=True, cmap=matplotlib_cmap) + fig = ax.get_figure() + handles, labels = ax.get_legend_handles_labels() + ax.legend( + reversed(handles), + reversed(labels), + bbox_to_anchor=(1, 1), + loc='upper left' + ) + plt.tight_layout() + + # # save and close + fig.savefig('out.png', dpi=300) + plt.close(fig) + + if tool == 'voronoi': + + plt.style.use('fast') + + tool_func = getattr(sm.pl, tool) + + # x_lim/y_lim need to be parsed from comma-sep str to integer tuples + for lim in ['x_lim', 'y_lim']: + opt_list = options.pop(lim) + if opt_list: + options[lim] = [int(x.strip()) for x in opt_list.split(',')] + + # parse list text arguments + for cat in ['overlay_points_categories', 'overlay_drop_categories']: + opt_list = options.pop(cat) + if opt_list: + options[cat] = [x.strip() for x in opt_list.split(',')] + + # add base args into options dict to pass to tool + options['color_by'] = params['analyses']['color_by'] + options['x_coordinate'] = params['analyses']['x_coordinate'] + options['y_coordinate'] = params['analyses']['y_coordinate'] + + # fill any missing params with None as tool expects + for k, v in options.items(): + if v == '': + options[k] = None + + options['saveDir'] = os.getcwd() + options['fileName'] = 'out.png' + + if options['size_max'] is None: + options['size_max'] = np.inf + + # call the tool and unpack all options + tool_func(adata, **options) + + +if __name__ == '__main__': + aparser = argparse.ArgumentParser() + aparser.add_argument("-i", "--inputs", dest="inputs", required=True) + aparser.add_argument("-a", "--anndata", dest="anndata", required=True) + aparser.add_argument("-e", "--output", dest="output", required=True) + + args = aparser.parse_args() + + main(args.inputs, args.anndata, args.output)