Боке: использовать 2 интерактивных виджета для фильтрации набора данных с CustomJS - PullRequest
0 голосов
/ 13 мая 2019

Я хочу отфильтровать свои данные на основе значений из 2 виджетов Select, где source['level'] == level и source['country'] == country.

Используя CustomJS, я смог заставить работать фильтр level, используя cb_obj.

Но cb_obj ссылается только на виджет, который его активировал. Как получить значение другого виджета выбора в функции обратного вызова?

Мне также нужно придерживаться CustomJS, спасибо!

Пример кода:

# Level
level = Select(title="Level:", value='All Levels', options=['All Levels', '1', '2', '3'], callback=callback)

# Country
country = Select(title="Country:", value='All Countries', options=['All Countries', 'US', 'UK', 'CAN'], callback=callback)

callback = CustomJS(args=dict(source=source, ts=true_source), code="""
    var df = source.data;
    var data = ts.data;
    var data_level = data['Level'];

    var l=cb_obj.value;

    var data_x = data['x'];
    var data_y = data['y'];

    var x=[];
    var y=[];

    for (var i=0;i<data_level.length; i++){

        // Here: I want to add (Level) and (Country) filters
        // But I'm not sure how to reference Country widget value
        if(l=='All Levels' || data_level[i]==l){
            x.push(data_x[i]);
            y.push(data_y[i]);}}

    df['x'] = [];
    df['y'] = [];

    df['x'] = x;
    df['y'] = y;

    source.change.emit();
"""

1 Ответ

0 голосов
/ 14 мая 2019

Вы можете явно передать оба Select виджета для обратного вызова следующим образом:

callback = CustomJS(args=dict(source = source, 
                              ts = true_source, 
                              level = level,
                              country = country), code=code)

Тогда вместо cb_obj.value вы получите значения, используя: level.value и country.value

...