我已经用
实现了散景图circle()
和 legend_group
进行着色和创建交互式图例的散点图。我为图例设置了
click_policy=hide
,以便当我单击图例项时隐藏特定组中的点(圆圈)。
所有这些最初都运行良好。然而,当我移动滑块时,图例“中断”:
这就是最初的情节:
当我移动滑块(位于绘图底部)时,某些组会从绘图中正确过滤掉,但只保留一个图例项,而多个组在绘图中仍然可见。
代码嵌入到面向对象的实现中。 这是将圆圈添加到图中的方法:
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
。问题是:为什么图例不显示其所有项目?这与滑块和/或滑块使用的回调有什么关系?
legend_label=cluster.label
(其中
cluster.label
是字符串文字)而不是
legend_group="year"
可以解决问题。这在
有关交互式图例的文档中指出:
交互式图例的功能目前仅适用于上述基本图例标签。通过指定自动分组的列创建的图例尚不支持交互功能。