Bokeh - Слайдер, конфликт обратных вызовов RadioGroup - PullRequest
0 голосов
/ 21 октября 2019

Вот упрощенная версия моего боке: df

YEAR |  AMOUNT   |NAME  |  NEST           |  FUND
2011     10        Joe      ("Q1",Jan")      JPN
2012    -20        Joe      ("Q2","Feb")     CAD
2013     30        Joe      ("Q3", "Apr")    USD
2011     12        Arn      ("Q1",Jan")      USD
2012    -250       Arn      ("Q2","Feb")     JPN
2013    -36        Arn      ("Q3", "Apr")    JPN

У меня есть столбчатая диаграмма с накоплением, показывающая суммы для Джо или Арна. Джо или Арн контролируются radio_group. Стеки FUND. Группы осей: NEST

factors = [
    ("Q1", "Jan"), ("Q1", "Feb"), ("Q1", "Mar"),
    ("Q2", "Apr"), ("Q2", "May"), ("Q2", "Jun"),
    ("Q3", "Jul"), ("Q3", "Aug"), ("Q3", "Sep"),
    ("Q4", "Oct"), ("Q4", "Nov"), ("Q4", "Dec"),
]

stacks=list(set(df.loc[df['FUND']))

bar_src= ColumnDataSource(data=df)
p= figure(plot_width=1150, plot_height=550, x_range=FactorRange(*factors))
view = CDSView(source=bar_src, filters=[GroupFilter(column_name="Name", group="Joe")])    
p.vbar_stack(stacks, x = "NESTS", width = 0.9 source = bar_src, view=view)

radio_group=RadioGroup(labels=['Joe','Arn'], active=0)
radio_group.callback=CustomJS(args=dict(source = bar_src, filter=view.filters[0]),
code="""filter.group = cb_obj.labels[cb_obj.active]
    source.change.emit();""")

У меня также есть год Slider

def year_chg(attr,old,new):
    new_df = pd.DataFrame({
        'YEAR':df['YEAR'][df['YEAR']==slider.value],
        'NEST':df['NEST'][df['YEAR']==slider.value],
        'NAME':df['ACCT_NUM'][df['YEAR']==slider.value],
        'FUND':df['FUND'][df['YEAR']==slider.value],
        'AMOUNT':df['AMOUNT'][df['YEAR']==slider.value],
        })
    new_data=ColumnDataSource(data=new_df)
    bar_src.data = new_data.data

slider= Slider(start=2011, end=2013.year, step=1, value=2013, title='Year')
slider.on_change('value',year_chg)

Все взаимодействия работают изолированно. Однако при объединении слайдер приводит к пустому графику с очень маленькими символами в верхнем левом углу.

Я также попытался обернуть радио CustomJS в функцию python и затем вызвать radio_group.js_on_change("active", CustomJS.from_py_func(change_name)), но этодает тот же результат.

Что не так?

1 Ответ

0 голосов
/ 22 октября 2019

Без полного минимального воспроизводителя трудно сказать что-либо конкретное, однако вы не должны назначать .data из одного CDS в другой CDS, как вы делаете в year_chg. В следующем Bokeh 2.0 попытка сделать это вызовет явное сообщение об ошибке. Хотя он ведет себя подобно dict, это не так. Чтобы поддерживать всю автоматическую синхронизацию между Python и JS, CDS .data на самом деле является очень специализированной структурой данных, которая имеет связи со многими другими вещами, и «переназначение» их с одного CDS на другой не поддерживается. Вы должны когда-либо назначать .data из plain python dict

source.data = { ... } # plain python dict

Если вам нужно адаптировать DataFrame, на CDS есть метод .from_df, который создаст соответствующийпростая структура python dict, которую вы можете использовать для назначения.

...