def range_column_filter(colname, stepsize, title=None): """Create a column filter, if the column exists and contains at least one\ not-None value. Creates the slider for the filter and returns a getter\ for the slider's current range""" if colname in entries[0]: column_data = [entry[colname] for entry in entries] if validate_column(column_data, colname): top = stepUp(max((val for val in column_data if val is not None)), stepsize) col_filter = RangeSlider( title = cols[colname] if title is None else title, range=(0, top), start = 0, end = top, step=stepsize ) getter = lambda :col_filter.range col_filter.on_change( 'range', lambda a,r,g: debounce( update, getter, 150, curdoc() ) ) widgets.append(col_filter) return getter
def __init__(self, analyser): """ Creates and manages the Gui for RangeAnalysis """ self.analyser = analyser self.fig = self.make_fig() init_start = self.analyser.x.min() * 1.1 init_end = self.analyser.x.max() * 0.9 span_kwargs = dict(dimension='height', line_dash='dashed', line_width=3) self.start_span = Span(location=init_start, line_color='green', **span_kwargs) self.end_span = Span(location=init_end, line_color='red', **span_kwargs) self.range_slide = RangeSlider(start=self.analyser.x.min(), end=self.analyser.x.max(), step=self.analyser.dx, value=(init_start, init_end), width=self.fig.plot_width) self.start_connected = widgets.Button(label="start", button_type='success') self.end_connected = widgets.Button(label="end", button_type='success') self.setup_callbacks() self.app = self.make_app() self.doc = None
def __init__(self): sel_vals = ['All', 'Shot'] self._data = OffsetData(r'fb_on_Shots_4TEST_FB_v2.csv', r'Shots_4TEST_FB_part.pickle') self._offset = None # self._div_debug = Div(text='Debug: <br>', width=1000) self._sel_type = Select(title="Slice type:", value=sel_vals[0], options=sel_vals) self._sld_slice = RangeSlider(start=0, end=10, value=(0,100), step=1, title="Slice Num") self._set_slider() self._sld_slice.on_change('value', self._update_all) self._sel_type.on_change('value', self.change_type) self._plot_image = figure(plot_width=800, plot_height=600,title='Offset') self._set_index() self._breaks = self._data.get_breaks() self._ds_offset = ColumnDataSource(data=self._get_offset()) colormap = plt.cm.seismic create_colors = [colormap(i) for i in np.arange(0,self._data._shots.max()+1,1)] colors = [None]*self._data._breaks.size for i in range(self._data._breaks.size): colors[i]=matplotlib.colors.to_hex(create_colors[self._data._shots[i]]) mapper = LinearColorMapper(palette=colors, low=self._data._shots.min(), high=self._data._shots.max()) self._plot_image.scatter(x='x', y='y', source=self._ds_offset, line_color=None, fill_color=transform('shot', mapper), size=2)
def range_column_filter(colname, stepsize, title=None): """Create a column filter, if the column exists and contains at least one\ not-None value. Creates the slider for the filter and returns a getter\ for the slider's current range""" if colname in entries[0]: column_data = [entry[colname] for entry in entries] if validate_column(column_data, colname): top = stepUp(max((val for val in column_data if val is not None)), stepsize) col_filter = RangeSlider( title = cols[colname] if title is None else title, value=(0, top), start = 0, end = top, step=stepsize ) getter = lambda :col_filter.value col_filter.on_change( 'value', lambda a,r,g: debounce( update, getter, 150, curdoc() ) ) widgets.append(col_filter) return getter
def setupChunkTimeWindow(self): #subtool to control the chunk size distribution self.grainSizeSlider = RangeSlider( start=0, end=300, value=[0, 20], step=1, title="Chunk Time Bounds", width=self.sliderWidth) #, callback=timeSliderCallback) self.grainSizeSlider.on_change("value", self.grainSizeSliderCallback) maxSamplePlot = figure(height=self.subplotSize, x_range=(0, 300), y_range=(0, 1.1), width=self.subplotSize, toolbar_location=None, title="Grain Size PDF", tools="") #x_range = (0,len(movedSignal))) maxSamplePlot.yaxis.visible = False maxSamplePlot.grid.visible = False numPoints = 10 chunkSizes = np.linspace(self.minGrainSz, self.maxGrainSz, numPoints) probs = np.linspace(0, 1, int(numPoints / 2)) probs = np.append(probs, probs[::-1]) maxSamplePlot.line(chunkSizes, probs, name="sampleSizePDF") # maxSampleWindow = column(maxSamplePlot,grainSizeSlider) return maxSamplePlot
def modify_doc(doc): plot = Plot(plot_height=400, plot_width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) slider = RangeSlider(start=0, end=10, value=(1, 5), title="bar", css_classes=["foo"], width=300) def cb(attr, old, new): slider.bar_color = "rgba(255, 255, 0, 1)" slider.on_change('value', cb) doc.add_root(column(slider, plot))
def test_js_on_change_executes(self, bokeh_model_page) -> None: slider = RangeSlider(start=0, end=10, value=(1, 5), title="bar", css_classes=["foo"], width=300) slider.js_on_change('value', CustomJS(code=RECORD("value", "cb_obj.value"))) page = bokeh_model_page(slider) drag_range_slider(page.driver, ".foo", "lower", 150) results = page.results assert float(results['value'][0]) > 1 assert float(results['value'][1]) == 5 drag_range_slider(page.driver, ".foo", "lower", 150) results = page.results assert float(results['value'][0]) > 1 assert float(results['value'][1]) > 5 assert page.has_no_console_errors()
class OffsetPage(object): def __init__(self): sel_vals = ['All', 'Shot'] self._data = OffsetData(r'fb_on_Shots_4TEST_FB_v2.csv', r'Shots_4TEST_FB_part.pickle') self._offset = None # self._div_debug = Div(text='Debug: <br>', width=1000) self._sel_type = Select(title="Slice type:", value=sel_vals[0], options=sel_vals) self._sld_slice = RangeSlider(start=0, end=10, value=(0,100), step=1, title="Slice Num") self._set_slider() self._sld_slice.on_change('value', self._update_all) self._sel_type.on_change('value', self.change_type) self._plot_image = figure(plot_width=800, plot_height=600,title='Offset') self._set_index() self._breaks = self._data.get_breaks() self._ds_offset = ColumnDataSource(data=self._get_offset()) colormap = plt.cm.seismic create_colors = [colormap(i) for i in np.arange(0,self._data._shots.max()+1,1)] colors = [None]*self._data._breaks.size for i in range(self._data._breaks.size): colors[i]=matplotlib.colors.to_hex(create_colors[self._data._shots[i]]) mapper = LinearColorMapper(palette=colors, low=self._data._shots.min(), high=self._data._shots.max()) self._plot_image.scatter(x='x', y='y', source=self._ds_offset, line_color=None, fill_color=transform('shot', mapper), size=2) def _get_offset(self): self._offset = self._data.get_offset() xs = self._offset ys = self._breaks return {'x': xs, 'y': ys} def _set_index(self): self._data.set_indices_offset(self._sel_type.value, self._sld_slice.value[0], self._sld_slice.value[1]) def _set_slider(self): min_val, max_val = self._data.get_minmax(self._sel_type.value) self._sld_slice.start = min_val self._sld_slice.end = max_val self._sld_slice.value = (0,min_val + (max_val - min_val) // 2) def change_type(self, attr, old, new): min_val, max_val = self._data.get_minmax(self._sel_type.value) self._sld_slice.value = (0,min_val + (max_val - min_val) // 2) self._sld_slice.start = min_val self._sld_slice.end = max_val _update_all def _update_all(self, attr, old, new): self._set_index() self._ds_offset.data = self._get_offset() def get_layout(self): wbox = widgetbox(self._sel_type, self._sld_slice) plots = row(self._plot_image) # return [wbox, plots, self._div_debug] return [column(wbox, plots)]
def modify_doc(doc): plot = Plot(plot_height=400, plot_width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) slider = RangeSlider(start=0, end=10, value=(1, 5), title="bar", css_classes=["foo"], width=300) def cb(attr, old, new): slider.bar_color = "rgba(255, 255, 0, 1)" slider.on_change('value', cb) doc.add_root(column(slider, plot))
def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1], val=["a", "b"])) plot = Plot(plot_height=400, plot_width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) plot.add_tools(CustomAction(callback=CustomJS(args=dict(s=source), code=RECORD("data", "s.data")))) slider = RangeSlider(start=0, end=10, value=(1, 5), title="bar", css_classes=["foo"], width=300) def cb(attr, old, new): source.data['val'] = [old, new] slider.on_change('value', cb) doc.add_root(column(slider, plot))
def generate_frame_plot(frame): sparse_data = json.loads(frame.frame_data) img = np.array(sparse_to_dense(sparse_data)) source = ColumnDataSource(data={'data': img.flatten()}) plot = figure(x_range=(0, 256), y_range=(0, 256), width=750, height=750, tools='hover,box_zoom,crosshair,reset,save', tooltips=[("x", "$x"), ("y", "$y"), ("value", "@image")], title="Frame {}".format(frame.id)) im = plot.image(image=[img], x=0, y=0, dw=256, dh=256, palette="Viridis11") range_slider_callback = CustomJS(args=dict(source=source, im=im), code=""" var image_source = im.data_source; var d = image_source.data['image'][0]; var f = slider.value for (var i = 0; i < d.length; i++) { if( source.data['data'][i] >= f[1]){ d[i] = f[1]; }else if(source.data['data'][i] <= f[0]){ d[i] = f[0]; } else{ d[i] = source.data['data'][i]; } } image_source.change.emit(); """) for i, cluster in enumerate(frame.clusters): bbox = json.loads(cluster.bbox) label = Label(x=bbox[3], y=bbox[2], text=str(i + 1), text_color='red', text_font_size="8pt") plot.add_layout(label) slider = RangeSlider(start=1, end=np.max(img) + 2, step=1, title="View Window", value=(1, np.max(img))) slider.js_on_change('value', range_slider_callback) range_slider_callback.args['slider'] = slider plot.toolbar.logo = None layout = Column(slider, plot) return layout
def generate_cluster_plot(cluster): data = json.loads(cluster.intensity_image) bbox = json.loads(cluster.bbox) length = bbox[2] - bbox[0] width = bbox[3] - bbox[1] img = np.array(data) source = ColumnDataSource(data={'data': img.flatten()}) plot = figure(match_aspect=True, width=350, height=350, tools='hover,box_zoom,crosshair,reset,save', tooltips=[("x", "$x"), ("y", "$y"), ("value", "@image")], title="Cluster View") im = plot.image(image=[img], x=0, y=0, dw=width, dh=length, palette="Inferno11") range_slider_callback = CustomJS(args=dict(source=source, im=im), code=""" var image_source = im.data_source; var d = image_source.data['image'][0]; var f = slider.value for (var i = 0; i < d.length; i++) { if( source.data['data'][i] >= f[1]){ d[i] = f[1]; }else if(source.data['data'][i] <= f[0]){ d[i] = f[0]; } else{ d[i] = source.data['data'][i]; } } image_source.change.emit(); """) # plot.sizing_mode = "fixed" plot.toolbar.logo = None slider = RangeSlider(start=1, end=np.max(img) + 2, step=1, title="View Window", value=(1, np.max(img))) slider.js_on_change('value', range_slider_callback) range_slider_callback.args['slider'] = slider return Column(slider, plot)
def compare_tab(): panel_title = Div(text="[Corridor Comparison]", css_classes = ["panel-title","text-center"]) panel_text = Div(text="""Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.""", css_classes = ["panel-content"]) #Date Range date_range = Div(text="Data References:<br>MMDDYYYY - MMDDYYYY", css_classes = ["panel-content","text-center"]) #Panel Buttons year_text = Div(text="<b>Year:", height=10) year_v1 = RangeSlider(start = 2015, end= 2017,step=1, value=(2015, 2017), height=25, bar_color="black",title = "View 1") year_v2 = RangeSlider(start = 2015, end= 2017,step=1, value=(2015, 2017), height=25, bar_color="black",title = "View 2") season_text = Div(text="<b>Season</b><br> (1=Winter, 2=Fall, 3=Spring, 4=Summer):", height=25) season_v1 = RangeSlider(start = 1, end= 4,step=1, value=(1, 2), height=25, bar_color="black",title = "View 1") season_v2 = RangeSlider(start = 1, end= 4,step=1, value=(1, 2), height=25, bar_color="black",title = "View 2") month_text = Div(text="<b>Month:", height=10) month_v1 = RangeSlider(start = 1, end= 12,step=1, value=(1, 2), height=25, bar_color="black",title = "View 1") month_v2 = RangeSlider(start = 1, end= 12,step=1, value=(1, 2), height=25, bar_color="black",title = "View 2") week_text = Div(text="<b>Day of Week:", height=10) week_v1 = RangeSlider(start = 1, end= 5,step=1, value=(1, 5), height=25, bar_color="black",title = "View 1") week_v2 = RangeSlider(start = 1, end= 5,step=1, value=(1, 5), height=25, bar_color="black",title = "View 2") time_of_day_text = Div(text="<b>Time of Day:", height=10) time_of_day_v1 = RangeSlider(start = 1, end= 24,step=1, value=(1, 7), bar_color="black", height=25) time_of_day_v2 = RangeSlider(start = 1, end= 24,step=1, value=(1, 7), bar_color="black", height=25) l1 = Div(text="test", css_classes = ["text-center"]) return row(column(panel_title, panel_text, date_range, year_text, year_v1, year_v2, Spacer(height=25), season_text, season_v1, season_v2, Spacer(height=25), month_text, month_v1, month_v2, Spacer(height=25), week_text, week_v1, week_v2, Spacer(height=25), time_of_day_text, time_of_day_v1, time_of_day_v2, height = 1000, css_classes = ["panel","col-lg-4"]), column(l1,css_classes = ["container-fluid","col-lg-8"]), css_classes = ["container-fluid","col-lg-12"])
def create_slider(plot, startYear, endYear): callback = CustomJS(args=dict(plot=plot), code=""" var a = cb_obj.value; plot.x_range.start = a[0]; plot.x_range.end = a[1]; """) range_slider = RangeSlider(start=startYear, end=endYear,value=(startYear, endYear), step=1, width= 440, title="Year Range") range_slider.js_on_change('value', callback) layout = column(plot,column(range_slider)) return layout
def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1], val=["a", "b"])) plot = Plot(plot_height=400, plot_width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) plot.add_tools(CustomAction(callback=CustomJS(args=dict(s=source), code=RECORD("data", "s.data")))) slider = RangeSlider(start=0, end=10, value=(1, 9), title="bar", css_classes=["foo"], width=300) def cb(attr, old, new): source.data['val'] = [old, new] slider.on_change('value', cb) doc.add_root(column(slider, plot))
def update_map(attr, old, new): global selection, vizual, gvplot, hvplot, heatmap, feats, points, world_map, range_slider, controls3, max_cur_feature, min_cur_feature, temp_feats max_cur_feature = temp_feats[choice.value].max() min_cur_feature = temp_feats[choice.value].min() range_slider = RangeSlider(start=min_cur_feature, end=max_cur_feature, value=(min_cur_feature, max_cur_feature), step=(max_cur_feature - min_cur_feature) / 20, title="Feature_range") range_slider.on_change('value', update_map_val) controls3 = widgetbox([range_slider], width=250) new_loc_feats = temp_feats.loc[ (temp_feats[choice.value] < range_slider.value[1]) & (temp_feats[choice.value] > range_slider.value[0])] feats = gv.Dataset(new_loc_feats, kdims=['Longitude', 'Latitude', new]) points = feats.to(gv.Points, ['Longitude', 'Latitude'], [new]) if len(new_loc_feats) <= 20000: world_map = gv.Overlay(tiles * points).options( 'Points', size=5, cmap='viridis', colorbar=True, tools=TOOLS, color_index=2, width=900, height=800, global_extent=True, colorbar_opts={'scale_alpha': 0.5}, fill_alpha=0.5, line_alpha=0.5) else: world_map = decimate(gv.Points(points), max_samples=20000).options( 'Points', size=5, cmap='viridis', colorbar=True, tools=TOOLS, color_index=2, width=900, height=800, global_extent=True, colorbar_opts={'scale_alpha': 0.5}, fill_alpha=0.5, line_alpha=0.5) selection = hv.streams.Selection1D(source=world_map) heatmap = hv.DynamicMap(selected_points, streams=[selection]) zoom = hv.DynamicMap(test_bounds, streams=[box]) hvplot = renderer.get_plot(heatmap, curdoc()) gvplot = renderer.get_plot(world_map, curdoc()) bvplot = renderer.get_plot(zoom, curdoc()) vizual.children[1].children = [gvplot.state, hvplot.state, bvplot.state]
def _histogram_widgets(col, y, n_bins, col_max, col_min, callback): if col_max is None: col_max = col.max() if col_min is None: col_min = col.min() slider = Slider(start=1, end=100, value=n_bins, step=1, title="Bins") slider.on_change('value', callback) range_select = RangeSlider(start=col.min(), end=col.max(), value=(col_min, col_max), step=5, title='Histogram Range') range_select.on_change('value', callback) return slider, range_select
def analytics_tab(): panel_title = Div(text="Highway Performance", css_classes=["panel-title", "text-center"]) panel_text = Div( text= """Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.""", css_classes=["panel-content"]) #Date Range date_range = Div(text="Data References:<br>MMDDYYYY - MMDDYYYY", css_classes=["panel-content", "text-center"]) #Panel Buttons period_select = Select(options=['test 1', 'test 2', 'test 3'], title='Time Period:', height=60) date_picker_start = DatePicker(min_date=date(2015, 1, 1), max_date=date(2017, 12, 31), css_classes=["panel-content", "col-lg-4"], title="Start Date:", height=60) month = Select(options=[ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], title="Month:", css_classes=["panel-content", "col-lg-4"], height=60) day_of_week = Select( options=["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], title="Day of Week:", height=60) time_of_day = RangeSlider(start=1, end=24, step=1, value=(1, 7), title="Time of Day:", bar_color="black", height=60) l1 = Div(text="test", css_classes=["text-center"]) return row(column(panel_title, panel_text, date_range, period_select, month, day_of_week, time_of_day, height=700, css_classes=["panel", "col-lg-4"]), column(l1, css_classes=["container-fluid", "col-lg-8"]), css_classes=["container-fluid", "col-lg-12"])
def test_server_bar_color_updates( self, bokeh_server_page: BokehServerPage) -> None: slider = RangeSlider(start=0, end=10, value=(1, 5), title="bar", width=300) def modify_doc(doc): plot = Plot(height=400, width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) def cb(attr, old, new): slider.bar_color = "rgba(255, 255, 0, 1)" slider.on_change('value', cb) doc.add_root(column(slider, plot)) page = bokeh_server_page(modify_doc) drag_range_slider(page.driver, slider, "lower", 150) sleep(1) # noUiSlider does a transition that takes some time assert get_slider_bar_color(page.driver, slider) == "rgba(255, 255, 0, 1)"
def test_title_updates(self, bokeh_model_page) -> None: slider = RangeSlider(start=0, end=10, value=(1, 9), title="bar", css_classes=["foo"], width=300) page = bokeh_model_page(slider) assert get_slider_title_value(page.driver, ".foo") == "1 .. 9" drag_range_slider(page.driver, ".foo", "lower", 50) value = get_slider_title_value(page.driver, ".foo").split()[0] assert float(value) > 1 assert float(value) == int(value) # integral step size # don't go past upper handle drag_range_slider(page.driver, ".foo", "lower", 50) value = get_slider_title_value(page.driver, ".foo").split()[0] assert float(value) > 2 drag_range_slider(page.driver, ".foo", "lower", -135) value = get_slider_title_value(page.driver, ".foo").split()[0] assert float(value) == 0 assert page.has_no_console_errors()
def test_displays_title_scientific(self, bokeh_model_page) -> None: slider = RangeSlider(start=0, end=10e-6, step=1e-6, value=(1e-6, 8e-6), title="bar", format=BasicTickFormatter(precision=2), css_classes=["foo"], width=300) page = bokeh_model_page(slider) el = page.driver.find_element_by_css_selector('.foo') assert len( el.find_elements_by_css_selector('div.bk-input-group > div')) == 2 # XXX: WebElement.text returns undecoded UTF-8 byte strings as str (!) (not bytes) def decode(s: str) -> str: return bytes(map(ord, s)).decode("utf-8") t0 = decode(get_slider_title_text(page.driver, ".foo")) t1 = decode(get_slider_title_value(page.driver, ".foo")) assert t0 == "bar: 1.00e\u22126 .. 8.00e\u22126" assert t1 == "1.00e\u22126 .. 8.00e\u22126" assert page.has_no_console_errors()
def document(doc): sliders = [] pre = PreText(text='something') select = MultiSelect(title='Select the columns', options=list(df.columns)) button = Button(label='Update') for col in cols: MIN, MAX = df[col].min(), df[col].max() STEP = (MAX - MIN) / 100 slider = RangeSlider(start=MIN, end=MAX, step=STEP, value=(MIN, MAX), title=col) sliders.append(slider) def update(): values = [] txt = '({col} > {low}) & ({col} < {high})' for slider in sliders: low, high = slider.value low, high = float(low), float(high) formula = txt.format(col=slider.title, low=low, high=high) values.append(formula) q = '&'.join(values) summary_cols = select.value text = df.query(q)[summary_cols].describe() pre.text = str(text) button.on_click(update) l = layout([column(sliders), [select, button]], pre) doc.add_root(l)
def make_extrema_slider(absolute_min, absolute_max, extrema_values, step, label, environment_callback): slider = RangeSlider(start=absolute_min, end=absolute_max, value=(extrema_values["minimum"], extrema_values["maximum"]), step=step, title=label) def update_extrema_callback(new_min, new_max): extrema_values["minimum"] = new_min extrema_values["maximum"] = new_max environment_callback() slider.on_change( "value", lambda _attr, _old, new_value: update_extrema_callback( new_value[0], new_value[1])) return slider
def test_display(self, bokeh_model_page: BokehModelPage) -> None: slider = RangeSlider(start=0, end=10, value=(1, 5), width=300) page = bokeh_model_page(slider) children = find_elements_for(page.driver, slider, "div.bk-input-group > div") assert len(children) == 2 assert page.has_no_console_errors()
def test_js_on_change_executes(self, bokeh_model_page): slider = RangeSlider(start=0, end=10, value=(1, 5), title="bar", css_classes=["foo"], width=300) slider.js_on_change('value', CustomJS(code=RECORD("value", "cb_obj.value"))) page = bokeh_model_page(slider) drag_slider(page.driver, ".foo", "lower", 150) results = page.results assert float(results['value'][0]) > 1 assert float(results['value'][1]) == 5 drag_slider(page.driver, ".foo", "lower", 150) results = page.results assert float(results['value'][0]) > 1 assert float(results['value'][1]) > 5 assert page.has_no_console_errors()
def test_display(self, bokeh_model_page) -> None: slider = RangeSlider(start=0, end=10, value=(1, 5), css_classes=["foo"], width=300) page = bokeh_model_page(slider) el = page.driver.find_element_by_css_selector('.foo') children = el.find_elements_by_css_selector('div.bk-input-group > div') assert len(children) == 2 assert page.has_no_console_errors()
def __init__(self, renderer): self.file_input = Dropdown(label="Select dataset", menu=[]) for dataset_name in SQLDBInformer(DbConn({})).get_all_schemas(): if dataset_name in set(["information_schema", "performance_schema", "sys", "defaultDB", "mysql"]): continue if dataset_name[:3] == "pg_": continue self.file_input.menu.append(dataset_name) self.run_id_dropdown = Dropdown(label="select run id here", menu=[]) self.ground_truth_id_dropdown = Dropdown(label="select ground truth id here", menu=[]) self.score_slider = RangeSlider(start=0, end=1, value=(0, 1), step=.1, callback_policy='mouseup', title="score range") self.max_elements_slider = Slider(start=1000, end=100000, value=10000, step=1000, callback_policy='mouseup', title="max render") self.range_link_radio = RadioGroup(labels=["Link read plot to x-range", "Link read plot to y-range"], active=0, orientation="horizontal") self.full_render_button = Button(label="render without limit") self.render_mems_button = Button(label="render MEMs") self.delete_button = Button(label="Delete Dataset") self.force_read_id = TextInput(value="", title="Render reads with ids (comma seperated list):") self.file_input.on_change("value", lambda x,y,z: self.file_input_change(renderer)) self.run_id_dropdown.on_change("value", lambda x,y,z: self.run_id_change(renderer)) self.ground_truth_id_dropdown.on_change("value", lambda x,y,z: self.ground_id_change(renderer)) self.score_slider.on_change("value_throttled", lambda x,y,z: self.slider_change(renderer)) self.max_elements_slider.on_change("value_throttled", lambda x,y,z: self.slider_change(renderer)) self.full_render_button.on_event(ButtonClick, lambda x: self.full_render(renderer)) self.render_mems_button.on_event(ButtonClick, lambda x: self.render_mems_button_event(renderer)) self.delete_button.on_event(ButtonClick, lambda x: self.delete_button_event(renderer)) self.force_read_id.on_change("value", lambda x,y,z: self.forced_read_ids_change(renderer)) self.spinner_div = Div(text=html_file("spinner"), sizing_mode="scale_both", visible=False) self.condition = threading.Condition() self.subset_buttons = CheckboxButtonGroup(labels=["Render false-positives", "Render false-negatives", "Render true-positives", "Compute Stats"], active=[0, 1, 2]) self.subset_buttons.on_click(lambda x: self.forced_read_ids_change(renderer)) self.blur_slider = Slider(start=0, end=500, value=100, step=1, callback_policy='mouseup', title="Blur") self.blur_slider.on_change("value_throttled", lambda x,y,z: self.slider_change(renderer))
def test_displays_bar_color(self, bokeh_model_page) -> None: slider = RangeSlider(start=0, end=10, value=(1, 5), title="bar", css_classes=["foo"], width=300, bar_color="red") page = bokeh_model_page(slider) el = page.driver.find_element_by_css_selector('.foo') assert len(el.find_elements_by_css_selector('div.bk-input-group > div')) == 2 assert get_bar_color(page.driver, ".foo") == "rgba(255, 0, 0, 1)" assert page.has_no_console_errors()
def test_displays_title_scientific(self, bokeh_model_page) -> None: slider = RangeSlider(start=0, end=10e-6, step=1e-6, value=(1e-6, 8e-6), title="bar", format=BasicTickFormatter(precision=2), css_classes=["foo"], width=300) page = bokeh_model_page(slider) el = page.driver.find_element_by_css_selector('.foo') assert len(el.find_elements_by_css_selector('div.bk-input-group > div')) == 2 assert get_title_text(page.driver, ".foo") == "bar: 1.00e-6 .. 8.00e-6" assert get_title_value(page.driver, ".foo") == "1.00e-6 .. 8.00e-6" assert page.has_no_console_errors()
def test_server_on_change_round_trip( self, bokeh_server_page: BokehServerPage) -> None: slider = RangeSlider(start=0, end=10, value=(1, 9), title="bar", width=300) def modify_doc(doc): source = ColumnDataSource(dict(x=[1, 2], y=[1, 1], val=["a", "b"])) plot = Plot(height=400, width=400, x_range=Range1d(0, 1), y_range=Range1d(0, 1), min_border=0) plot.add_glyph(source, Circle(x='x', y='y', size=20)) plot.tags.append( CustomJS(name="custom-action", args=dict(s=source), code=RECORD("data", "s.data"))) def cb(attr, old, new): source.data['val'] = [old, new] slider.on_change('value', cb) doc.add_root(column(slider, plot)) page = bokeh_server_page(modify_doc) drag_range_slider(page.driver, slider, "lower", 50) page.eval_custom_action() results = page.results old, new = results['data']['val'] assert float(old[0]) == 1 assert float(new[0]) > 1 drag_range_slider(page.driver, slider, "lower", 50) page.eval_custom_action() results = page.results old, new = results['data']['val'] assert float(new[0]) > 2 drag_range_slider(page.driver, slider, "lower", -135) page.eval_custom_action() results = page.results old, new = results['data']['val'] assert float(new[0]) == 0
def cb(attr, old, new): ## load experiment ie in plot p1 and p2 ie = new['value'][0] fid = polymer.getfid(ie) #print(fid) #source_fid = ColumnDataSource.from_df(data=fid) source_fid.data = ColumnDataSource.from_df(fid) #print(source_fid) try: tau = get_x_axis(polymer.getparameter(ie)) #print(tau) try: startpoint = polymer.getparvalue(ie, 'fid_amp_start') endpoint = polymer.getparvalue(ie, 'fid_amp_stop') except: startpoint = int(0.05 * polymer.getparvalue(ie, 'BS')) endpoint = int(0.1 * polymer.getparvalue(ie, 'BS')) phi = get_mag_amplitude(fid, startpoint, endpoint, polymer.getparvalue(ie, 'NBLK'), polymer.getparvalue(ie, 'BS')) df = pd.DataFrame(data=np.c_[tau, phi], columns=['tau', 'phi']) df['phi_normalized'] = (df['phi'] - df['phi'].iloc[0]) / ( df['phi'].iloc[-1] - df['phi'].iloc[1]) polymer.addparameter(ie, 'df_magnetization', df) fit_option = 2 #mono exponential, 3 parameter fit p0 = [1.0, polymer.getparvalue(ie, 'T1MX')**-1 * 2, 0] df, popt = magnetization_fit(df, p0, fit_option) source_df.data = ColumnDataSource.from_df(df) polymer.addparameter(ie, 'popt(mono_exp)', popt) print(popt) #print(df) print(polymer.getparvalue(ie, 'df_magnetization')) fid_slider = RangeSlider(start=1, end=polymer.getparvalue(ie, 'BS'), range=(startpoint, endpoint), step=1, callback_policy='mouseup') layout_p1.children[2] = fid_slider except KeyError: print('no relaxation experiment found') tau = np.zeros(1) phi = np.zeros(1) df = pd.DataFrame(data=np.c_[tau, phi], columns=['tau', 'phi']) df['phi_normalized'] = np.zeros(1) df['fit_phi'] = np.zeros(1) source_df.data = ColumnDataSource.from_df(df)
def update_dataset(attr, old, new): selected_dataset = dataset.value rank_slice.end = data_manager.get_size(selected_dataset) rank_slice.update(value=(1, data_manager.get_size(selected_dataset))) metadata_type = data_manager.get_metadata_type(selected_dataset) metadata_domain = data_manager.get_metadata_domain(selected_dataset) while len(metadata_filters) > 0: metadata_filters.pop() for attribute in metadata_type: m_type = metadata_type[attribute] m_domain = metadata_domain[attribute] if m_type == 'boolean': filter = Select(title=attribute, value="Any", options=["Any", "True", "False"]) elif m_type == 'numerical': filter = RangeSlider(start=m_domain[0], end=m_domain[1], value=m_domain, step=1, title=attribute) elif m_type == 'categorical': categories = sorted(list(metadata_domain[attribute])) filter = MultiSelect(title=attribute, value=categories, options=categories) elif m_type == 'set': categories = sorted(list(metadata_domain[attribute])) filter = MultiSelect(title=attribute, value=categories, options=categories) else: raise ValueError( 'Unsupported attribute type {} in metadata'.format(m_type)) metadata_filters.append(filter) for control in metadata_filters: if hasattr(control, 'value'): control.on_change('value', update) if hasattr(control, 'active'): control.on_change('active', update) inputs.children = build_controls() update(attr, old, new)
def create_range_slider(range: Range1d, title: str, step: float) -> RangeSlider: slider = RangeSlider( start=range.start, end=range.end, step=step, value=(range.bounds[0], range.bounds[1]), title=title, ) slider.js_link("value", range, "start", attr_selector=0) slider.js_link("value", range, "end", attr_selector=1) return slider
def test_keypress_event(self, bokeh_model_page: BokehModelPage) -> None: slider = RangeSlider(start=0, end=10, value=(1, 5), title="bar", width=300) page = bokeh_model_page(slider) handle_lower = find_element_for(page.driver, slider, ".noUi-handle-lower") handle_upper = find_element_for(page.driver, slider, ".noUi-handle-upper") select_element_and_press_key(page.driver, handle_lower, Keys.ARROW_RIGHT, press_number=1) assert get_slider_title_value(page.driver, slider) == "2 .. 5" select_element_and_press_key(page.driver, handle_lower, Keys.ARROW_LEFT, press_number=5) assert get_slider_title_value(page.driver, slider) == "0 .. 5" select_element_and_press_key(page.driver, handle_lower, Keys.ARROW_RIGHT, press_number=11) assert get_slider_title_value(page.driver, slider) == "5 .. 5" select_element_and_press_key(page.driver, handle_upper, Keys.ARROW_RIGHT, press_number=1) assert get_slider_title_value(page.driver, slider) == "5 .. 6" select_element_and_press_key(page.driver, handle_upper, Keys.ARROW_LEFT, press_number=2) assert get_slider_title_value(page.driver, slider) == "5 .. 5" select_element_and_press_key(page.driver, handle_upper, Keys.ARROW_RIGHT, press_number=6) assert get_slider_title_value(page.driver, slider) == "5 .. 10" assert page.has_no_console_errors()