我有一个散景图,从图表中的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个元素。即使它们隐藏在图表中。
我试图更新传奇的事情:
legend.items[4].renderers[0].visible=false
legend.items[4].visible=false
legend.change.emit()
,legend.items[4].change.emit()
和legend.items[4].renderers[0].change.emit()
Legend()
方法覆盖不同的图例请注意,我没有收到这些调用的任何错误,它们只是在图例中没有产生任何差异。添加多个图例并隐藏/取消隐藏它们是有效的,但使用plot.add_layout()
时它们的放置是错误的
我宁愿不使用交互式服务器这样做,而宁愿使用客户端进行切换。我的用例经常来回,可能想要离线功能。
谁能指出我正确的方向?我在散景0.12.16中测试了这个,在python 3.6.5中测试了0.13.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.13.0开始,这仍然是一个悬而未决的问题,并且不可能: