|
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