def make_qualimap_plots(qmglobals=None, coverage_per_contig=None): """Make qualimap summary plots""" retval = { "fig": {"coverage_per_contig": None, "globals": None}, "file": {"coverage_per_contig": coverage_per_contig, "globals": qmglobals}, "uri": {"coverage_per_contig": data_uri(coverage_per_contig), "globals": data_uri(qmglobals)}, } # Globals if qmglobals is not None: df_all = pd.read_csv(qmglobals) df_all["Sample"] = df_all["Sample"].astype("str") fig = figure( y_range=[0, max(df_all["number of reads"])], title="Mapping summary", title_text_font_size="12pt", plot_width=400, plot_height=400, x_range=sorted(list(set(df_all["Sample"]))), ) mdotplot( fig, x="Sample", size=10, df=df_all, alpha=0.5, y=["number of reads", "number of mapped reads", "number of duplicated reads", "number of unique reads"], ) xaxis(fig, axis_label="sample", major_label_orientation=np.pi / 3, axis_label_text_font_size="10pt") yaxis(fig, axis_label="count", major_label_orientation=1, axis_label_text_font_size="10pt") retval["fig"]["globals"] = fig # Coverage per contig if coverage_per_contig is not None: df_all = pd.read_csv(coverage_per_contig, index_col=0) df_all["Sample"] = df_all["Sample"].astype("str") fig = figure(width=300, height=300) points( fig, x="chrlen_percent", y="mapped_bases_percent", df=df_all, glyph="text", text="chr", text_font_size="8pt" ) main(fig, title_text_font_size="8pt") xaxis(fig, axis_label="Chromosome length of total (%)", axis_label_text_font_size="8pt") yaxis(fig, axis_label="Mapped bases of total (%)", axis_label_text_font_size="8pt") gp = facet_grid( fig, x="chrlen_percent", y="mapped_bases_percent", df=df_all, groups=["Sample"], width=300, height=300, share_x_range=True, share_y_range=True, title_text_font_size="12pt", ) for fig in [item for sublist in gp.children for item in sublist]: abline(fig, x="chrlen_percent", y="mapped_bases_percent", df=df_all, slope=1) retval["fig"]["coverage_per_contig"] = gp return retval
def test_style(self): points(self._fig, "x", "y", self._data, line_color='gray', size=20, color="red")
def mpoints(fig, x, y, df=None, source=None, glyph='circle', color=False, legend=False, **kwargs): """points: add points from multiple columns to a figure Args: fig (:py:class:`~bokeh.plotting.Plot`): bokeh Plot object x (str): string for x component y (str, list): string or list of strings for y component df (:py:class:`~pandas.DataFrame`): pandas DataFram source (:py:class:`~bokeh.models.sources.ColumnDataSource`): bokeh sources.ColumnDataSource object glyph (str): glyph character to use color (bool): set color legend (bool): set legend kwargs: keyword arguments to pass to glyph drawing function Examples: .. bokeh-plot:: :source-position: above import pandas as pd from bokeh.plotting import figure, show, hplot from bokehutils.mgeom import mpoints df = pd.DataFrame([[1,2,3], [2,5,2], [3,9,6]], columns=["x", "y", "z"]) f = figure(title="Points", plot_width=400, plot_height=400) mpoints(f, "x", ["y", "z"], df, size=10, line_color="black") show(f) """ logger.debug("Adding mpoints to figure {}".format(fig)) for i in range(len(y)): points(fig=fig, x=x, y=y[i], df=df, source=source, glyph=glyph, **kwargs) if color: # Add color here # color = brewer["PiYG"][min(max(3, len(y)), 10)] pass if legend: # Add legend here via legend function pass
def test_legend(self): points(self._fig, "x", "y", self._data) legend(self._fig, orientation="bottom_left")
def test_axis(self): points(self._fig, "x", "y", self._data) points(self._fig, "y", "x", self._data, color="red") xaxis(self._fig, axis_label="x", major_label_orientation=np.pi / 3)
def test_axis_no_splat(self): points(self._fig, "x", "y", self._data) xaxis(self._fig, formatter=NumeralTickFormatter(format="0.0%"))
def test_axis_wrong_args(self): points(self._fig, "x", "y", self._data) xaxis(self._fig, foo="bar")
def test_init(self): points(self._fig, "x", "y", self._data)
def scrnaseq_pca_plots(pca_results_file=None, metadata=None, pcacomp=(1,2), pcaobjfile=None): """Make PCA QC plots for scrnaseq workflow Args: pca_results_file (str): pca results file metadata (str): metadata file name pcacomp (int): tuple of ints corresponding to components to draw pcaobjfile (str): file name containing pickled pca object Returns: dict: dictionary with keys 'fig' pointing to a (:py:class:`~bokeh.models.GridPlot`) Bokeh GridPlot object and key 'table' pointing to a (:py:class:`~bokeh.widgets.DataTable`) DataTable """ if not metadata is None: md = pd.read_csv(metadata, index_col=0) if not pcaobjfile is None: with open(pcaobjfile, 'rb') as fh: pcaobj = pickle.load(fh) df_pca = pd.read_csv(pca_results_file, index_col="sample") df_pca['color'] = ['red'] * df_pca.shape[0] df_pca['x'] = df_pca['0'] df_pca['y'] = df_pca['1'] source = ColumnDataSource(df_pca) TOOLS = "pan,wheel_zoom,box_zoom,box_select,resize,reset,save,hover" # Add radio button group cmap = colorbrewer(datalen = df_pca.shape[0], palette="RdYlBu") callback_rbg = CustomJS(args=dict(source=source), code=""" var data = source.get('data'); var active = cb_obj.get('active') var label = cb_obj.get('label')[active] var RdYlBu = { 3: ["#fc8d59","#ffffbf","#91bfdb"], 4: ["#d7191c","#fdae61","#abd9e9","#2c7bb6"], 5: ["#d7191c","#fdae61","#ffffbf","#abd9e9","#2c7bb6"], 6: ["#d73027","#fc8d59","#fee090","#e0f3f8","#91bfdb","#4575b4"], 7: ["#d73027","#fc8d59","#fee090","#ffffbf","#e0f3f8","#91bfdb","#4575b4"], 8: ["#d73027","#f46d43","#fdae61","#fee090","#e0f3f8","#abd9e9","#74add1","#4575b4"], 9: ["#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4"], 10: ["#a50026","#d73027","#f46d43","#fdae61","#fee090","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"], 11: ["#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"]}; var colormap = {}; var j = 0; for (i = 0; i < data['sample'].length; i++) { if (data[label][i] in colormap) { } else { colormap[data[label][i]] = j; j++; } } var nfac = Object.keys(colormap).length; if (nfac > 11) { nfac = 11; } if (nfac < 3) { nfac = 3; } var colors = RdYlBu[nfac]; for (i = 0; i < data[label].length; i++) { data['color'][i] = colors[colormap[data[label][i]]] } source.trigger('change'); """) callback = CustomJS(args=dict(source=source), code=""" var data = source.get('data'); var active = cb_obj.get('active'); var label = cb_obj.get('label'); var RdYlBu = { 3: ["#fc8d59","#ffffbf","#91bfdb"], 4: ["#d7191c","#fdae61","#abd9e9","#2c7bb6"], 5: ["#d7191c","#fdae61","#ffffbf","#abd9e9","#2c7bb6"], 6: ["#d73027","#fc8d59","#fee090","#e0f3f8","#91bfdb","#4575b4"], 7: ["#d73027","#fc8d59","#fee090","#ffffbf","#e0f3f8","#91bfdb","#4575b4"], 8: ["#d73027","#f46d43","#fdae61","#fee090","#e0f3f8","#abd9e9","#74add1","#4575b4"], 9: ["#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4"], 10: ["#a50026","#d73027","#f46d43","#fdae61","#fee090","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"], 11: ["#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"]}; var colormap = {}; if (!active) { var j = 0; for (i = 0; i < data['sample'].length; i++) { if (data[label][i] in colormap) { } else { colormap[data[label][i]] = j; j++; } } var nfac = Object.keys(colormap).length; if (nfac > 11) { nfac = 11; } if (nfac < 3) { nfac = 3; } var colors = RdYlBu[nfac]; for (i = 0; i < data[label].length; i++) { data['color'][i] = colors[colormap[data[label][i]]] } source.trigger('change'); } """) if not md is None: # Waiting for callbacks to be implemented upstream in bokeh # rbg = RadioButtonGroup(labels=list(md.columns), # callback=callback) toggle_buttons = [Toggle(label=x, callback=callback) for x in list(md.columns)] else: toggle_buttons = [] # rbg = RadioButtonGroup() # PC components xcallback = CustomJS(args=dict(source=source), code=""" var data = source.get('data'); var active = cb_obj.get('active') var value = cb_obj.get('value') x = data['x'] for (i = 0; i < x.length; i++) { x[i] = data[value][i] data['sample'][i] = value data['FileID'][i] = active } source.trigger('change'); """) ycallback = CustomJS(args=dict(source=source), code=""" var data = source.get('data'); var value = cb_obj.get('value') y = data['y'] for (i = 0; i < y.length; i++) { y[i] = data[value][i] } source.trigger('change'); """) pca_components = sorted([int(x) + 1 for x in source.column_names if re.match("\d+", x)]) menulist = [(str(x), str(x)) for x in pca_components] component_x = Dropdown(label = "PCA component x", menu = menulist, default_value="1", callback=xcallback) component_y = Dropdown(label = "PCA component y", menu = menulist, default_value="2", callback=ycallback) # Make the pca plot kwfig = {'plot_width': 400, 'plot_height': 400, 'title_text_font_size': "12pt"} p1 = figure(title="Principal component analysis", tools=TOOLS, **kwfig) points(p1, 'x', 'y', source=source, color='color', size=10, alpha=.7) kwxaxis = {'axis_label': "Component {} ({:.2f}%)".format( pcacomp[0], 100.0 * pcaobj.explained_variance_ratio_[pcacomp[0] - 1]), 'axis_label_text_font_size': '10pt', 'major_label_orientation': np.pi/3} kwyaxis = {'axis_label': "Component {} ({:.2f}%)".format( pcacomp[1], 100.0 * pcaobj.explained_variance_ratio_[pcacomp[1] - 1]), 'axis_label_text_font_size': '10pt', 'major_label_orientation': np.pi/3} xaxis(p1, **kwxaxis) yaxis(p1, **kwyaxis) tooltiplist = [("sample", "@sample")] if "sample" in source.column_names else [] if not md is None: tooltiplist = tooltiplist + [(str(x), "@{}".format(x)) for x in md.columns] tooltips(p1, HoverTool, tooltiplist) # Detected genes, FPKM and TPM p2 = figure(title="Number of detected genes", x_range=list(df_pca.index), tools=TOOLS, **kwfig) kwxaxis.update({'axis_label': "Sample"}) kwyaxis.update({'axis_label': "Detected genes"}) dotplot(p2, "sample", "FPKM", source=source) xaxis(p2, **kwxaxis) yaxis(p2, **kwyaxis) tooltips(p2, HoverTool, [('sample', '@sample'), ('# genes (FPKM)', '@FPKM')]) return {'fig':vform(*(toggle_buttons + [gridplot([[p1, p2]])]))}
def test_axis(self): points(self._fig, "x", "y", self._data) points(self._fig, "y", "x", self._data, color="red") xaxis(self._fig, axis_label="x", major_label_orientation=np.pi/3)