Altair Dynami c комбинация условий выбора - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь создать диаграмму, где можно выбрать комбинации разных столбцов данных, установив флажки. Однако я не всегда хочу отображать флажки для всех столбцов. Поэтому я хочу добавить выборки в диаграмму «динамически c».

Я хочу сделать то, чего хочу sh, - это сделать предварительный выбор категорий, которые я хочу визуализировать (это делается до того, как будет создана диаграмма альтаира). Эти категории затем добавляются как флажки в 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]
)

Но это не работает.

Я не могу понять, как добиться как то так с альтаиром. Может ли кто-нибудь привести пример того, как сделать это с помощью флажков, или помочь мне найти другой метод для достижения той же цели?

TLDR: я в основном хочу поддерживать переменное количество категорий, которое также поддерживает возможность создания комбинаций из категорий.
РЕДАКТИРОВАТЬ: Пытался сделать более ясным, что я пытаюсь достичь с помощью кода.

1 Ответ

1 голос
/ 29 апреля 2020

Звучит так, будто вы хотите написать эквивалент этого, не зная длины 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.

...