首页 > 解决方案 > 如何将不同的回调链接到 Python Bokeh 中的每个 CheckboxButtonGroup 按钮

问题描述

我是 Bokeh 的新手,正在尝试学习如何使用它的功能。我正在尝试一个使用带有三个单独按钮的 CheckbokButtonGroup 的简单示例。目标是按下按钮 1 并让它在 y 轴上的字形中添加或减去 3,具体取决于它是被点击的偶数还是奇数次,按钮 2 应该将现有项目乘以 3 或 -3,具体取决于奇数或偶数点击和按钮 3 应根据点击次数将项目提升 3 或 -3 的幂。我的问题是,如何将组中的每个按钮链接到单独的回调函数?在提供的示例中,我能够将一个回调链接到所有按钮,但我希​​望每个按钮都有一个不同的回调。

from bokeh.models import ColumnDataSource, CustomJS, Button
from bokeh.models import CheckboxButtonGroup
from bokeh.plotting import Figure, output_file, show
from bokeh.layouts import column

output_file("js_on_change.html")

x = [1.2, 2.4, 0.8, 5.6, 12.1, 8.8]
y = [3.4, 1.1, 4.2, 6.6, 1.8, 12.1]
z = ['Apple', 'Apple', 'Orange', 'Orange', 'Orange', 'Orange']

data = dict(x=x, y=y, z=z)
source = ColumnDataSource(data)

counter = [0]
counter = dict(counter=counter)
counter1 = ColumnDataSource(counter)
counter2 = ColumnDataSource(counter)
counter3 = ColumnDataSource(counter)

plot = Figure(plot_width=400, plot_height=400)
plot.circle('x', 'y', source=source, size=8, line_alpha=0.6)

callback1 = CustomJS(args=dict(source=source, counter=counter1), code="""
    var f = 3.0

    var count = counter.data;
    var c = count['counter']
    if (c[0]%2==1) f = -1*f;
    c[0]++
    counter.change.emit();
    
    var data = source.data;
    var x = data['x']
    var y = data['y']
    for (var i = 0; i < x.length; i++) {
        y[i] = y[i] + f
    }
    source.change.emit();
""")

callback2 = CustomJS(args=dict(source=source, counter=counter2), code="""
    var f = 3.0

    var count = counter2.data;
    var c = count['counter']
    if (c[0]%2==1) f = -1*f;
    c[0]++
    counter.change.emit();
    
    var data = source.data;
    var x = data['x']
    var y = data['y']
    for (var i = 0; i < x.length; i++) {
        y[i] = y[i] * f
    }
    source.change.emit();
""")

callback3 = CustomJS(args=dict(source=source, counter=counter3), code="""
    var f = 3.0

    var count = counter3.data;
    var c = count['counter']
    if (c[0]%2==1) f = -1*f;
    c[0]++
    counter.change.emit();
    
    var data = source.data;
    var x = data['x']
    var y = data['y']
    for (var i = 0; i < x.length; i++) {
        y[i] = Math.pow(x[i], f)
    }
    source.change.emit();
""")

LABELS = ["Add Subtract", "Multiply", "Power"]

checkbox_button_group = CheckboxButtonGroup(labels=LABELS, active=[0, 1, 2])

checkbox_button_group.js_on_click(callback1)

layout = column(checkbox_button_group, plot)
show(layout)

标签: pythonpython-3.xbokeh

解决方案


推荐阅读