散景:在JavaScript回调中隐藏图例项

时间:2018-08-31 21:53:44

标签: bokeh

我有一个散景图,该图以图表中的7条线系列开始。选择小部件会更改数据,并通过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)

其中line0line6是图中图中链接到数据对象data['y0']data['y6']的线,而select是散景选择器小部件。

这在bokeh图表本身中效果很好,但不会更新图例。图例始终与首次渲染时相同。它保留了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()

时它们的放置是错误的

我宁愿不使用交互式服务器来执行此操作,而是宁愿使用客户端来进行切换。我的用例经常来回移动,并且可能希望具有脱机功能。

有人能指出我正确的方向吗?我在python 3.6.5的bokeh 0.12.16和0.13.0中对此进行了测试。

谢谢

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是预先制作所有图例并将其全部隐藏

#ifndef HELLO_LIB_H
#define HELLO_LIB_H

#include <string>
using namespace std;

class Hello {
    std::string _name;
    public:
        Hello(std::string name);
        void Print();
};

#endif

然后在回调中

The type or namespace name 'Droid' does not exist in the namespace 'Lottie.Forms' (are you missing an assembly reference?)

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

答案 1 :(得分:0)

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

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