Bokeh - Slider、RadioGroup 回调冲突
Bokeh - Slider, RadioGroup callback conflict
这是我的散景的简化版本:
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
我有一个堆叠分组条形图显示 Joe 或 Arn 的金额。 Joe 或 Arn 由 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))
但它产生相同的结果。
出了什么问题?
没有一个完整的最小复制器,很难说出任何具体的东西,但是,您不应该像在 year_chg
中那样将一个 CDS 中的 .data
分配给另一个 CDS。在即将推出的 Bokeh 2.0 中,尝试这样做将引发明确的错误消息。尽管它的行为类似于 dict
,但事实并非如此。为了支持 Python 和 JS 之间的所有自动同步,CDS .data
实际上是一个非常专业的数据结构,它与许多其他事物有联系,并且 "re-homing" 它们从一个 CDS 到另一个不支持。您应该只从 plain python dict
分配给 .data
source.data = { ... } # plain python dict
如果您需要调整 DataFrame,CDS 上有一个 .from_df
方法可以创建适当的普通 python 字典结构,您可以使用它来分配。
这是我的散景的简化版本: 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
我有一个堆叠分组条形图显示 Joe 或 Arn 的金额。 Joe 或 Arn 由 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))
但它产生相同的结果。
出了什么问题?
没有一个完整的最小复制器,很难说出任何具体的东西,但是,您不应该像在 year_chg
中那样将一个 CDS 中的 .data
分配给另一个 CDS。在即将推出的 Bokeh 2.0 中,尝试这样做将引发明确的错误消息。尽管它的行为类似于 dict
,但事实并非如此。为了支持 Python 和 JS 之间的所有自动同步,CDS .data
实际上是一个非常专业的数据结构,它与许多其他事物有联系,并且 "re-homing" 它们从一个 CDS 到另一个不支持。您应该只从 plain python dict
.data
source.data = { ... } # plain python dict
如果您需要调整 DataFrame,CDS 上有一个 .from_df
方法可以创建适当的普通 python 字典结构,您可以使用它来分配。