散景:在javascript回调中隐藏传奇项目

问题描述 投票:1回答:2

我有一个散景图,从图表中的7个系列开始。 select小部件更改数据,并通过customjs回调仅显示4个系列

for i in range(7):
    if i < 4:
        js_code += """data['y%d']=data.%s;""" % (i,newseriesnames[i])
    js_code += """line%d.visible = %s;""" % (i,'true' if i < 4 else 'false')
js_code += 'source.change.emit();'
callback = CustomJS(args = args,code=js_code)
select.js_on_change('value',callback)

其中line0通过line6是连接到数据对象的图中的线data['y0']通过data['y6']select是一个散景选择器小部件。

这在散景图本身中效果很好,但它不会更新图例。图例始终与首次渲染时相同。它保留了7个元素。即使它们隐藏在图表中。

我试图更新传奇的事情:

  1. 设置legend.items[4].renderers[0].visible=false
  2. 设置legend.items[4].visible=false
  3. 打电话给legend.change.emit()legend.items[4].change.emit()legend.items[4].renderers[0].change.emit()
  4. 使用bokeh的python Legend()方法覆盖不同的图例

请注意,我没有收到这些调用的任何错误,它们只是在图例中没有产生任何差异。添加多个图例并隐藏/取消隐藏它们是有效的,但使用plot.add_layout()时它们的放置是错误的

我宁愿不使用交互式服务器这样做,而宁愿使用客户端进行切换。我的用例经常来回,可能想要离线功能。

谁能指出我正确的方向?我在散景0.12.16中测试了这个,在python 3.6.5中测试了0.13.0。

谢谢

bokeh
2个回答
0
投票

一种可能的解决方案是事先制作所有传说并将它们全部隐藏起来

for group_name in group_names:
    legend_items[group_name] = make_legend(group_name)
    plot.add_layout(legend_items[group_name], 'right')
for g in legend_items:
    legend_items[g].visible = False
legend_items[group_names[0]].visible = True

然后在回调中

for f in group_names:
    js_code += """legend_items['%s'].visible = false;""" % f
js_code += 'legend_items[f].visible = true;'

我不认为这是一个特别好的解决方案,但它解决了我似乎无法动态更新图例的事实。


0
投票

从0.13.0开始,这仍然是一个悬而未决的问题,并且不可能:

https://github.com/bokeh/bokeh/issues/589

© www.soinside.com 2019 - 2024. All rights reserved.