Skip to content

Commit 4e3d0f4

Browse files
Small improvement for 'Show lines' & 'Show points'
1 parent df63346 commit 4e3d0f4

File tree

1 file changed

+51
-23
lines changed

1 file changed

+51
-23
lines changed

pydatalab/src/pydatalab/bokeh_plots.py

Lines changed: 51 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
LinearColorMapper,
1919
TableColumn,
2020
)
21-
from bokeh.models.widgets import CheckboxGroup, Select
21+
from bokeh.models.widgets import Select
2222
from bokeh.palettes import Accent, Dark2
2323
from bokeh.plotting import ColumnDataSource, figure
2424
from bokeh.themes import Theme
@@ -432,39 +432,67 @@ def selectable_axes_plot(
432432
plot_columns = [table] + plot_columns
433433

434434
if plot_points and plot_line:
435-
plot_visibility_controls = CheckboxGroup(
436-
labels=["Show lines", "Show points"],
437-
active=[0, 1],
438-
margin=(5, 5, 5, 5),
439-
inline=True,
435+
from bokeh.layouts import row
436+
437+
show_lines_btn = Button(
438+
label="✓ Show lines", button_type="primary", width_policy="min", margin=(2, 5, 2, 5)
439+
)
440+
show_points_btn = Button(
441+
label="✓ Show points", button_type="primary", width_policy="min", margin=(2, 5, 2, 5)
440442
)
441443

442-
line_renderers = [r for r in p.renderers if hasattr(r.glyph, "line_color")]
444+
line_renderers = [
445+
r
446+
for r in p.renderers
447+
if hasattr(r.glyph, "line_color") and not hasattr(r.glyph, "size")
448+
]
443449
circle_renderers = [r for r in p.renderers if hasattr(r.glyph, "size")]
444450

445-
visibility_callback = CustomJS(
446-
args=dict(
447-
checkboxes=plot_visibility_controls,
448-
line_renderers=line_renderers,
449-
circle_renderers=circle_renderers,
450-
),
451+
lines_callback = CustomJS(
452+
args=dict(btn=show_lines_btn, renderers=line_renderers),
451453
code="""
452-
var active = checkboxes.active;
453-
var show_lines = active.includes(0);
454-
var show_points = active.includes(1);
455-
456-
for (var i = 0; i < line_renderers.length; i++) {
457-
line_renderers[i].visible = show_lines;
454+
if (btn.label.includes('✓')) {
455+
btn.label = '✗ Show lines';
456+
btn.button_type = 'default';
457+
for (var i = 0; i < renderers.length; i++) {
458+
renderers[i].visible = false;
459+
}
460+
} else {
461+
btn.label = '✓ Show lines';
462+
btn.button_type = 'primary';
463+
for (var i = 0; i < renderers.length; i++) {
464+
renderers[i].visible = true;
465+
}
458466
}
467+
""",
468+
)
459469

460-
for (var i = 0; i < circle_renderers.length; i++) {
461-
circle_renderers[i].visible = show_points;
470+
points_callback = CustomJS(
471+
args=dict(btn=show_points_btn, renderers=circle_renderers),
472+
code="""
473+
if (btn.label.includes('✓')) {
474+
btn.label = '✗ Show points';
475+
btn.button_type = 'default';
476+
for (var i = 0; i < renderers.length; i++) {
477+
renderers[i].visible = false;
478+
}
479+
} else {
480+
btn.label = '✓ Show points';
481+
btn.button_type = 'primary';
482+
for (var i = 0; i < renderers.length; i++) {
483+
renderers[i].visible = true;
484+
}
462485
}
463486
""",
464487
)
465488

466-
plot_visibility_controls.js_on_change("active", visibility_callback)
467-
plot_columns.append(plot_visibility_controls)
489+
show_lines_btn.js_on_click(lines_callback)
490+
show_points_btn.js_on_click(points_callback)
491+
492+
controls_layout = row(
493+
show_lines_btn, show_points_btn, sizing_mode="scale_width", margin=(10, 0, 10, 0)
494+
)
495+
plot_columns.append(controls_layout)
468496

469497
layout = column(*plot_columns, sizing_mode="scale_width")
470498

0 commit comments

Comments
 (0)