altair动态组合选择条件
altair dynamic combination of selection conditions
我正在尝试创建一个图表,其中可以通过切换复选框 select 不同数据列的组合。但是我并不总是想显示所有列的复选框。所以我想以 'dynamic' 的方式将 select 离子添加到图表中。
我想要完成的事情是,我想预先 selection 我想可视化哪些类别(这是在创建 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:我基本上想支持数量可变的类别,同时支持创建类别组合的能力。
编辑:试图更清楚地说明我正在尝试使用代码实现的目标。
听起来你想在不知道 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]}}
这三种方法中的任何一种在 Altair 图表中使用时都应该产生相同的结果。
我正在尝试创建一个图表,其中可以通过切换复选框 select 不同数据列的组合。但是我并不总是想显示所有列的复选框。所以我想以 'dynamic' 的方式将 select 离子添加到图表中。
我想要完成的事情是,我想预先 selection 我想可视化哪些类别(这是在创建 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:我基本上想支持数量可变的类别,同时支持创建类别组合的能力。
编辑:试图更清楚地说明我正在尝试使用代码实现的目标。
听起来你想在不知道 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]}}
这三种方法中的任何一种在 Altair 图表中使用时都应该产生相同的结果。