altair动态组合选择条件



我正在尝试创建一个图表,通过切换复选框可以选择不同列数据的组合。但是,我并不总是希望显示所有列的复选框。因此,我想以"动态"的方式将所选内容添加到图表中。

我想完成的是,我想预先选择我想可视化的类别(这是在创建altair图表之前完成的(。然后,这些类别将作为复选框添加到altair中。然而,我能找到的唯一方法是以硬编码的方式添加它们,如下面代码中的"sel1[0]和sel1[1]&sel1[2]和sel1[3]和sel1[4]":

sel1 = [
alt.selection_single(
bind=alt.binding_checkbox(name=field),
fields=[field],
init={field: False}
)
for field in category_selection
]
transform_args = {str(col): f'toBoolean(datum.{col})' for col in category_selection}
alt.Chart(df1).transform_calculate(**transform_args).mark_point(filled=True).encode(
x='dim1',
y='dim2',
opacity=alt.condition(
sel1[0] & sel1[1] & sel1[2] & sel1[3] & sel1[4],
alt.value(1), alt.value(0)
)
).add_selection(
*sel1
)

我试过这样做:

alt.Chart(df1).transform_calculate(**transform_args).mark_point(filled=True).encode(
x='dim1',
y='dim2',
opacity=alt.condition(
{'and': sel[:2]},
alt.value(1), alt.value(0)
)
).add_selection(
*sel1[:2]
)

但这并不奏效。

我似乎不知道如何用altair实现这样的目标。有人能提供一个如何使用复选框的例子吗?或者帮助我找到另一种方法来实现同样的事情?

TLDR:我基本上想支持可变数量的类别,同时也支持创建类别组合的能力
EDIT:试图更清楚地表明我试图用代码实现的目标。

听起来你想在不知道sel:长度的情况下编写类似的内容

sel = [alt.selection_single() for i in range(3)]
combined = sel[0] & sel[1] & sel[2]

对于一般的Python运算符,您可以这样做:

import operator
import functools
combined = functools.reduce(operator.and_, sel)

在Altair中,您也可以直接构建生成的Vega Lite规范:

combined = {"selection": {"and": [s.name for s in sel]}}

当在牛郎星图中使用时,这三种方法中的任何一种都应该导致相同的结果。

最新更新