Bokeh 图例因 Python 回调而中断

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

我已经用

实现了散景图
  1. 使用
    circle()
    legend_group
    进行着色和创建交互式图例的散点图。
  2. 带有可过滤数据的 Python 回调的范围滑块

我为图例设置了

click_policy=hide
,以便当我单击图例项时隐藏特定组中的点(圆圈)。

所有这些最初都运行良好。然而,当我移动滑块时,图例“中断”:

  1. 图例项目随机消失,即使上面的多个组仍然可见
  2. 保留的图例项目行为错误。由于初始总组数很少,只剩下一项。对于许多初始组,往往会保留几个,但当我单击其中一个时,多个会变灰,而只有一个相应的圆圈组被隐藏。

这就是最初的情节:

当我移动滑块(位于绘图底部)时,某些组会从绘图中正确过滤掉,但只保留一个图例项,而多个组在绘图中仍然可见。

代码嵌入到面向对象的实现中。 这是将圆圈添加到图中的方法:

    def _add_circles(self):
        palette = self._select_palette()
        labels = self._data[self._LABEL_FIELD].unique().tolist()

        for cluster in self._clusters:
            glyph = self._figure.circle(
                source=self._source,
                x="x",
                y="y",
                color=factor_cmap(self._LABEL_FIELD, palette, labels),
                legend_group=self._LABEL_FIELD,
                view=CDSView(
                    filter=GroupFilter(
                        column_name=self._LABEL_FIELD, group=cluster.label
                    ),
                ),
            )

            if cluster.label == OUTLIERS_LABEL:
                glyph.visible = False

此方法设置图例:

    def _setup_legend(self, legend_location: str = "right", click_policy: str = "hide"):
        legend = self._figure.legend[0]

        legend.label_text_font_size = "6px"
        legend.spacing = 0
        legend.location = legend_location
        legend.click_policy = click_policy

带回调的滑块添加如下:

    def _year_slider(self) -> RangeSlider:
        def callback(attr, old, new):  # noqa: unused-argument
            self._source.data = self._data.loc[
                self._data.year.between(new[0], new[1])
            ].to_dict(orient="list")

        min_year: int = self._data[self._YEAR_COLUMN].min()
        max_year: int = self._data[self._YEAR_COLUMN].max()

        slider = RangeSlider(
            start=min_year,
            end=max_year,
            value=(min_year, max_year),
            width=self._figure.frame_width,
        )
        slider.on_change("value_throttled", callback)
        return slider

当我将滑块移回其原始范围时,所有图例项目都会再次正确显示。

移动滑块后,

Legend

 对象仍包含所有 
LegendItem
 对象。它们都将 
visible
 属性设置为 
true

问题是:为什么图例不显示其所有项目?这与滑块和/或滑块使用的回调有什么关系?

python slider filtering legend bokeh
1个回答
0
投票
看起来使用

legend_label=cluster.label

 (其中 
cluster.label
 是字符串文字)而不是 
legend_group="year"
 可以解决问题。

这在

有关交互式图例的文档中指出:

交互式图例的功能目前仅适用于上述基本图例标签。通过指定自动分组的列创建的图例尚不支持交互功能。

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