【问题标题】:Bokeh: hiding legend items in javascript callback散景:在 javascript 回调中隐藏图例项
【发布时间】:2018-09-18 00:52:27
【问题描述】:

我有一个散景图,它以图表中的 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)

其中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()时它们的位置是错误的@

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

谁能指出我正确的方向?我在 python 3.6.5 的散景 0.12.16 和 0.13.0 中对此进行了测试。

谢谢

【问题讨论】:

    标签: bokeh


    【解决方案1】:

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

    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;'
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 现在可以吗?我一直遇到完全相同的问题并尝试了相同的解决方案+其他解决方案,到目前为止还没有运气,我有点绝望(告诉我您是否希望我为此进行讨论,我只是想如果您有现在的解决方案最好在这里发布:))
      • 您现在可以设置图例项的 visible 属性(在 Python 或 JS 中),如其他答案所述。
      • 我在 JS 中尝试过,作为 OP,但无法让它工作,并在 Python 中测试它产生AttributeError: unexpected attribute 'visible' to LegendItem, possible attributes are index, js_event_callbacks, js_property_callbacks, label, name, renderers, subscribed_events or tags,对应于the doc,我想不通我做错了什么,提前道歉?
      • 我错了,这仍然是一个悬而未决的问题github.com/bokeh/bokeh/issues/9261您最好的办法是从列表中完全添加/删除单个图例项目Legend.items。
      • 啊,我明白了 :) 我试过了,即使我删除了所有这些,我也没有做任何我可以在视觉上检测到的事情。我最“成功”的尝试是切换图例项渲染器的visible 属性,但这隐藏了相关的字形(不确定我在这里使用的术语是否正确,基本上是数据),根本不修改图例.我会关注这个问题 :) 谢谢!
      猜你喜欢
      • 2020-07-27
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2022-07-04
      • 1970-01-01
      相关资源
      最近更新 更多