|
18 | 18 | LinearColorMapper,
|
19 | 19 | TableColumn,
|
20 | 20 | )
|
21 |
| -from bokeh.models.widgets import CheckboxGroup, Select |
| 21 | +from bokeh.models.widgets import Select |
22 | 22 | from bokeh.palettes import Accent, Dark2
|
23 | 23 | from bokeh.plotting import ColumnDataSource, figure
|
24 | 24 | from bokeh.themes import Theme
|
@@ -432,39 +432,67 @@ def selectable_axes_plot(
|
432 | 432 | plot_columns = [table] + plot_columns
|
433 | 433 |
|
434 | 434 | 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) |
440 | 442 | )
|
441 | 443 |
|
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 | + ] |
443 | 449 | circle_renderers = [r for r in p.renderers if hasattr(r.glyph, "size")]
|
444 | 450 |
|
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), |
451 | 453 | 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 | + } |
458 | 466 | }
|
| 467 | + """, |
| 468 | + ) |
459 | 469 |
|
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 | + } |
462 | 485 | }
|
463 | 486 | """,
|
464 | 487 | )
|
465 | 488 |
|
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) |
468 | 496 |
|
469 | 497 | layout = column(*plot_columns, sizing_mode="scale_width")
|
470 | 498 |
|
|
0 commit comments