output_backend="webgl") cr = p.circle(x='tsne_x', y='tsne_y', color=cls_color_mapper, source=source) cr.selection_glyph = Circle(fill_color=cls_color_mapper, line_color=cls_color_mapper) cr.nonselection_glyph = Circle(fill_color=cls_color_mapper, line_color=cls_color_mapper, fill_alpha=0.05, line_alpha=0.05) color_bar = ColorBar(color_mapper=LinearColorMapper(palette="Viridis256", low=1, high=10), label_standoff=12, border_line_color=None, location=(0, 0)) p.add_layout(color_bar, 'right') color_bar.visible = False if type(cls_color_mapper['transform']) is LinearColorMapper: color_bar.color_mapper = cls_color_mapper['transform'] # p.add_layout(color_bar, 'right') color_bar.visible = True # Define widgets hover_tip_tool = HoverTool(tooltips=generate_tooltip_html(), show_arrow=False, renderers=[cr]) wheel_zoom_tool = WheelZoomTool() file_select_dropdown = Dropdown(label="Data file", button_type="warning", height_policy='min', menu=[('refresh list', 'refresh_list'), None]) update_file_list() color_class_select = Select(title="Colored by:",
def Mosaic_Plot(clone_df, png=None, title="", top_clones=5000, count_col="Clustered", vgene_col="VGene", jgene_col="JGene", isotype_col="Isotype", vshm_col="V_SHM", jshm_col="J_SHM", vgene_colors=vgene_colors, vfamily_colors=vfamily_colors, jgene_colors=jgene_colors, isotype_colors=isotype_colors, line_width=0.3, figsize=(600, 600), hover_tooltip=True): figure_params = { "plot_width": figsize[0], "plot_height": figsize[1], #"sizing_mode": "scale_both", "x_range": Range1d(-0.1, 1.1, bounds=(-1.0, 2.0)), "y_range": Range1d(-0.1, 1.1, bounds=(-1.0, 2.0)), #"outline_line_alpha": 0.0, "title": title, "tools": "pan, wheel_zoom, box_zoom, save, reset, help", "active_scroll": "wheel_zoom", "toolbar_location": "right" } plot = figure(**figure_params) plot.grid.visible = False plot.axis.visible = False hover_tooltips = [("Clone ID", "@CloneID")] info_cols = [count_col] if vgene_col is not None: info_cols.append(vgene_col) hover_tooltips.append(("V Gene", "@" + vgene_col)) if jgene_col is not None: info_cols.append(jgene_col) hover_tooltips.append(("J Gene", "@" + jgene_col)) if isotype_col is not None: info_cols.append(isotype_col) hover_tooltips.append(("Isotype", "@" + isotype_col)) if vshm_col is not None: info_cols.append(vshm_col) hover_tooltips.append(("V Gene SHM", "@" + vshm_col + "{(0.00%)}")) if jshm_col is not None: info_cols.append(jshm_col) hover_tooltips.append(("J Gene SHM", "@" + jshm_col + "{(0.00%)}")) if hover_tooltip: hover_tool = HoverTool(point_policy="snap_to_data", tooltips=hover_tooltips) plot.add_tools(hover_tool) mosaic_df = clone_df[info_cols] mosaic_df = mosaic_df.sort_values([count_col], ascending=[False]) if top_clones: mosaic_df = mosaic_df.head(top_clones) total_area = float(mosaic_df[count_col].sum()) mosaic_df["Clone_Frequencies"] = mosaic_df[count_col].astype( float) / total_area hover_tooltips.append(("Clone Frequency", "@Clone_Frequencies{(0.00%)}")) mosaic_rects = squarify(mosaic_df["Clone_Frequencies"].tolist(), 0.0, 0.0, 1.0, 1.0) #Add half width/height to x/y position for center points mosaic_df["x"] = [rect["x"] + rect["dx"] / 2.0 for rect in mosaic_rects] mosaic_df["y"] = [rect["y"] + rect["dy"] / 2.0 for rect in mosaic_rects] mosaic_df["width"] = [rect["dx"] for rect in mosaic_rects] mosaic_df["height"] = [rect["dy"] for rect in mosaic_rects] #By default there is no legend text, since colors are alternating and non-informative mosaic_df["legend"] = "" mosaic_df["Empty_Legend"] = "" alternating_colors = [ RGB(102, 194, 165), RGB(252, 141, 98), RGB(141, 160, 203) ] alt2_color_cycle = cycle(alternating_colors[0:2]) alt3_color_cycle = cycle(alternating_colors) mosaic_df["alternating2_colors"] = [ next(alt2_color_cycle) for _ in mosaic_rects ] mosaic_df["alternating3_colors"] = [ next(alt3_color_cycle) for _ in mosaic_rects ] #Default color scheme is alternating 3 colors mosaic_df["fill_color"] = mosaic_df["alternating3_colors"] #Set up various mosaic coloring options and associated legends color_select_options = ["Alternating (2)", "Alternating (3)"] if vgene_col in mosaic_df.columns: mosaic_df["vgene_colors"] = mosaic_df[vgene_col].map(vgene_colors) vfamilies = mosaic_df[vgene_col].str.split("-").str[0] mosaic_df["vfamily_colors"] = vfamilies.map(vfamily_colors) color_select_options.append("V Gene") color_select_options.append("V Family") mosaic_df["VGene_Legend"] = mosaic_df[vgene_col] mosaic_df["VFamily_Legend"] = mosaic_df[vgene_col].str.split( "-").str[0] if jgene_col in mosaic_df.columns: mosaic_df["jgene_colors"] = mosaic_df[jgene_col].map(jgene_colors) color_select_options.append("J Gene") mosaic_df["JGene_Legend"] = mosaic_df[jgene_col] if isotype_col in mosaic_df.columns: mosaic_df["isotype_colors"] = mosaic_df[isotype_col].map( isotype_colors) color_select_options.append("Isotype") mosaic_df["Isotype_Legend"] = mosaic_df[isotype_col] #Using viridis as a quantitative heatmap color scheme for SHM values #The SHM values are binned into 180 groups; viridis in >180 bins uses some values twice, which pandas.cut can't use shm_viridis = list(viridis(180)) colorbar_tick_formatter = NumeralTickFormatter(format="0.00%") if vshm_col in mosaic_df.columns: vshm_min = mosaic_df[vshm_col].min() vshm_max = mosaic_df[vshm_col].max() #Use pandas.cut to bin the V gene SHM values into the heatmap colors mosaic_df["vshm_colors"] = pandas.cut(mosaic_df[vshm_col], bins=180, labels=shm_viridis) color_select_options.append("V Gene SHM") vshm_color_mapper = LinearColorMapper(palette=shm_viridis, low=vshm_min, high=vshm_max) vshm_ticks = FixedTicker(ticks=numpy.linspace(vshm_min, vshm_max, 8)) vshm_colorbar = ColorBar(color_mapper=vshm_color_mapper, location=(0, 0), name="vshm_colorbar", label_standoff=12, formatter=colorbar_tick_formatter, ticker=vshm_ticks) plot.add_layout(vshm_colorbar, "right") if jshm_col in mosaic_df.columns: jshm_min = mosaic_df[jshm_col].min() jshm_max = mosaic_df[jshm_col].max() #Use pandas.cut to bin the J gene SHM values into the heatmap colors mosaic_df["jshm_colors"] = pandas.cut(mosaic_df[jshm_col], bins=180, labels=shm_viridis) color_select_options.append("J Gene SHM") jshm_color_mapper = LinearColorMapper(palette=shm_viridis, low=jshm_min, high=jshm_max) jshm_ticks = FixedTicker(ticks=numpy.linspace(jshm_min, jshm_max, 8)) jshm_colorbar = ColorBar(color_mapper=jshm_color_mapper, location=(0, 0), name="jshm_colorbar", label_standoff=12, formatter=colorbar_tick_formatter, ticker=jshm_ticks) plot.add_layout(jshm_colorbar, "right") mosaic_source = ColumnDataSource(mosaic_df) plot.rect(x="x", y="y", width="width", height="height", fill_color="fill_color", legend="legend", line_color="black", line_width=line_width, source=mosaic_source) #By default, the plot legend and ColorBar should be turned off (since the color is repeating and uninformative) plot.legend[0].visible = False vshm_colorbar = plot.select("vshm_colorbar")[0] jshm_colorbar = plot.select("jshm_colorbar")[0] vshm_colorbar.visible = False jshm_colorbar.visible = False if png is not None: export_png(plot, png) change_args = { "source": mosaic_source, "legend_obj": plot.legend[0], "vshm_colorbar_obj": vshm_colorbar, "jshm_colorbar_obj": jshm_colorbar } change_rect_color = CustomJS(args=change_args, code=""" var selection = cb_obj.value.toLowerCase(); var new_color_array; var new_legend_array; if(selection.indexOf("v gene shm") !== -1) { new_color_array = source.data["vshm_colors"]; new_legend_array = source.data["Empty_Legend"]; legend_obj.visible = false; vshm_colorbar_obj.visible = true; jshm_colorbar_obj.visible = false; } else if(selection.indexOf("j gene shm") !== -1) { new_color_array = source.data["jshm_colors"]; new_legend_array = source.data["Empty_Legend"]; legend_obj.visible = false; vshm_colorbar_obj.visible = false; jshm_colorbar_obj.visible = true; } else if(selection.indexOf("v gene") !== -1) { new_color_array = source.data["vgene_colors"]; new_legend_array = source.data["VGene_Legend"]; legend_obj.visible = true; vshm_colorbar_obj.visible = false; jshm_colorbar_obj.visible = false; } else if(selection.indexOf("v family") !== -1) { new_color_array = source.data["vfamily_colors"]; new_legend_array = source.data["VFamily_Legend"]; legend_obj.visible = true; vshm_colorbar_obj.visible = false; jshm_colorbar_obj.visible = false; } else if(selection.indexOf("j gene") !== -1) { new_color_array = source.data["jgene_colors"]; new_legend_array = source.data["JGene_Legend"]; legend_obj.visible = true; vshm_colorbar_obj.visible = false; jshm_colorbar_obj.visible = false; } else if(selection.indexOf("isotype") !== -1) { new_color_array = source.data["isotype_colors"]; new_legend_array = source.data["Isotype_Legend"]; legend_obj.visible = true; vshm_colorbar_obj.visible = false; jshm_colorbar_obj.visible = false; } else if(selection.indexOf("2") !== -1) { new_color_array = source.data["alternating2_colors"]; new_legend_array = source.data["Empty_Legend"]; legend_obj.visible = false; vshm_colorbar_obj.visible = false; jshm_colorbar_obj.visible = false; } else { new_color_array = source.data["alternating3_colors"]; new_legend_array = source.data["Empty_Legend"]; legend_obj.visible = false; vshm_colorbar_obj.visible = false; jshm_colorbar_obj.visible = false; } var fill_color = source.data["fill_color"]; var legend = source.data["legend"]; for(idx = 0; idx < fill_color.length; idx++) { fill_color[idx] = new_color_array[idx]; legend[idx] = new_legend_array[idx]; } source.change.emit(); """) patch_coloring_select = Select(title="Color by:", options=color_select_options, value="Alternating (3)", callback=change_rect_color) plot_layout = column(patch_coloring_select, plot) return plot_layout