def __init__(self, *args, **kwargs): super(InsertHist, self).__init__(*args, **kwargs) self.kw = { 'figure': { 'plot_width': 400, 'plot_height': 400, 'title': "Insert size distribution", 'title_text_font_size': "10pt", }, 'facet': { 'groups': ["Sample"], 'width': 300, 'height': 300, 'share_x_range': True, 'x': 'insert_size', 'y': [x for x in list(self.columns) if x.startswith("All_Reads")], 'title_text_font_size': "12pt", }, 'renderer': { 'x': 'insert_size', 'y': [x for x in list(self.columns) if x.startswith("All_Reads")], 'legend' : [x for x in list(self.columns) if x.startswith("All_Reads")], 'line_width' : 2, }, 'xaxis': {'axis_label': 'Insert size', 'axis_label_text_font_size': '10pt'}, 'yaxis': {'axis_label': 'Count', 'axis_label_text_font_size': '10pt'}} self.kw['renderer']['color'] = colorbrewer(datalen = len(self.kw['renderer']['y']), palette="RdYlBu") self.plot_hist = self.facet_grid_hist
def lines(fig, x, y, df=None, source=None, groups=None, **kwargs): """lines: add lines to a figure Args: fig (:py:class:`~bokeh.plotting.Plot`): bokeh Plot object x (str): string for x component y (str): string for y component df (:py:class:`~pandas.DataFrame`): pandas DataFram source (:py:class:`~bokeh.models.ColumnDataSource`): bokeh ColumnDataSource object groups (str, list(str)): string or list of strings for columns to group by kwargs: keyword arguments to pass to fig.line Example: .. bokeh-plot:: :source-position: above import pandas as pd from bokeh.plotting import figure, show, hplot from bokehutils.geom import lines df = pd.DataFrame([[1,2], [2,5], [3,9]], columns=["x", "y"]) f = figure(title="Line plot", plot_width=400, plot_height=400) lines(f, "x", "y", df, legend="y") lines(f, "x", "x", df, legend="x", color="red") show(f) """ logger.debug("Adding points to figure {}".format(fig)) if groups is None: fig.line(x=x, y=y, source=source, **kwargs) else: try: grouped = df.groupby(groups) except: raise colors = colorbrewer(datalen=len(grouped.groups.keys())) for k, color in zip(grouped.groups.keys(), colors): name = k group = grouped.get_group(name) source = ColumnDataSource(group) if 'legend' in kwargs: kwargs['legend'] = name if 'color' in kwargs: kwargs['color'] = color fig.line(x=x, y=y, source=source, **kwargs)
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]])]))}