Javascript Python Bokeh自定义组

Javascript Python Bokeh自定义组,javascript,python,charts,bokeh,dashboard,Javascript,Python,Charts,Bokeh,Dashboard,我对Python和Pandas有相当丰富的经验,但对Bokeh软件包非常陌生,在过去几天里一直在努力完成这项任务,没有取得任何进展。我正在构建一个仪表板来显示数据,使用单选按钮在同一个绘图上选择/显示不同的线将非常有用。我一直在遵循下面的示例(),使用复选框可以很好地工作。我已经将第21行中的“CheckboxGroup”以及“active”参数更改为“RadioGroup”。结果是,当我更改单选按钮的选择时,两条绘制的线都消失了,再也不会回来。我不明白为什么CheckboxGroup工作,而R

我对Python和Pandas有相当丰富的经验,但对Bokeh软件包非常陌生,在过去几天里一直在努力完成这项任务,没有取得任何进展。我正在构建一个仪表板来显示数据,使用单选按钮在同一个绘图上选择/显示不同的线将非常有用。我一直在遵循下面的示例(),使用复选框可以很好地工作。我已经将第21行中的“CheckboxGroup”以及“active”参数更改为“RadioGroup”。结果是,当我更改单选按钮的选择时,两条绘制的线都消失了,再也不会回来。我不明白为什么CheckboxGroup工作,而RadioGroup不工作,考虑到它们是多么相似,而且它们都使用“active”事件进行回调。有人能指出我的错误吗

import numpy as np

from bokeh.io import show
from bokeh.layouts import widgetbox
from bokeh.models.widgets import CheckboxGroup, RadioGroup
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.layouts import column, row
from bokeh.plotting import figure

t = np.arange(0.0, 2.0, 0.01)
s = np.sin(3*np.pi*t)
c = np.cos(3*np.pi*t)

source = ColumnDataSource(data=dict(t=t, s=s, c=c))

plot = figure(plot_width=400, plot_height=400)
a = plot.line('t', 's', source=source, line_width=3, line_alpha=0.6, 
line_color='blue')
b = plot.line('t', 'c', source=source, line_width=3, line_alpha=0.6,
line_color='red')

checkbox = RadioGroup(labels=["Cosinus", "Sinus"], active=0)

checkbox.callback = CustomJS(args=dict(line0=a, line1=b), code="""   
    //console.log(cb_obj.active);
    line0.visible = false;
    line1.visible = false;
    for (i in cb_obj.active) {
        //console.log(cb_obj.active[i]);
        if (cb_obj.active[i] == 0) {
            line0.visible = true;
        } else if (cb_obj.active[i] == 1) {
            line1.visible = true;
        }
    }
""")

layout = row(plot, widgetbox(checkbox))

show(layout)

我认为使用多线方法绘制此图更容易。然后,您可以选择在回调中选择哪一行,如下所示

import numpy as np

from bokeh.io import show
from bokeh.layouts import widgetbox
from bokeh.models.widgets import CheckboxGroup, RadioGroup
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.layouts import column, row
from bokeh.plotting import figure

t = np.arange(0.0, 2.0, 0.01)
s = np.sin(3*np.pi*t)
c = np.cos(3*np.pi*t)

source = ColumnDataSource(data=dict(t=[t]*2, s=[s,c], colors = ['red', 'blue']))

plot = figure(plot_width=400, plot_height=400)
plot.multi_line('t', 's',line_color='colors' ,source=source)

checkbox = RadioGroup(labels=["Cosinus", "Sinus"], active=0)

checkbox.callback = CustomJS(args=dict(s=source), code="""   
    s.selected['1d'].indices = [cb_obj.active]
    s.trigger('change');
""")

layout = row(plot, widgetbox(checkbox))

show(layout)

在radioboxgroup中,一次只能有一个活动值,因此当您尝试在整数上循环时,for循环是无用的。这是您的代码更正

checkbox.callback = CustomJS(args=dict(line0=a, line1=b), code="""   
    line0.visible = false;
    line1.visible = false;

    if (cb_obj.active == 0) {
        line0.visible = true;
    } else if (cb_obj.active == 1) {
        line1.visible = true;
    }
""")
有一种更好的方法可以做到这一点,如果你有很多行,你可以在循环中使用“标签”列表的长度

line_list = [line0,line1];

lab_len=cb_obj.labels.length;

for (i=0;i<lab_len;i++) {
if (cb_obj.active == i) {
line_list[i].visible = true;
} else {
line_list[i].visible = false;
}
}
line_list=[line0,line1];
lab_len=cb_obj.labels.length;

对于(i=0;i如果您试图让用户轻松控制图示符的可见性,那么从Bokeh
0.12.5
开始,当用户单击图示符条目时,您可以使图示符具有交互式,以隐藏图示符或使其静音:

如果要完全隐藏图示符,请将图例的
单击策略设置为
“隐藏”

您还可以将策略设置为静音:

p.legend.click_policy = "mute"
但是您需要指定每个glyph的“静音”外观,例如

p.circle([1,2,3], [4,5,6], muted_alpha=0.2, legend="foo")

这正是我一直在寻找的,现在就像一个魅力:)我喜欢这种紧凑,我将不得不在下一个仪表板中使用它。我一直在Bokeh使用pandas数据帧(或其片段),但我在很多地方都看到了ColumnDataSource。将DF中的相关数据放在ColumnDataSource中,然后绘制出来,而不是直接使用DF,这样做值得吗?使用ColumnDataSource和其他数据源对象的关键原因是,大多数交互和动态更新都需要它们。要使用数据帧更新或更改绘图,很可能每次都必须重新创建整个绘图。在我目前的经验中,我发现使用ColumnDataSource更容易,如果我想从DF获取数据,只需使用to_dict方法即可。
p.legend.click_policy = "mute"
p.circle([1,2,3], [4,5,6], muted_alpha=0.2, legend="foo")