Альтаир: два независимых слайдера для многослойного сюжета - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть такой фрейм данных ( код для генерации данных):
image

I want to compare two lines - l1 and l2, both depend on the parameter t. Each line has five values of t sampled that are numbered with t_i. I want to plot both lines, with one of the sampled points highlighted for each line. The points to highlight should be set with two sliders - one for each line.

I can get it working without the sliders:

base = alt.Chart(df).encode(x='x', y='y', color='line_name')
for line_name in df.line_name.unique():
  line = base.transform_filter(datum.line_name == line_name)
  plots += [line.mark_line(), line.mark_point().transform_filter(datum.t_i == int(line_name[1]))]
alt.layer(*plots)

Или с 1 ползунком:

for line_name in df.line_name.unique():
  line = base.transform_filter(datum.line_name == line_name)
  slider = alt.binding_range(min=0, max=4, step=1, name='t_i:')
  select_t_i = alt.selection_single(name="t_i", fields=['t_i'], bind=slider, init={'t_i': 0})
  plots += [line.mark_line(), 
            line.mark_point().add_selection(select_t_i).transform_filter(select_t_i)]
alt.layer(*plots[:-1])

Я получаю ожидаемый результат:

image

But if I change the last line to actually add the second slider:

alt.layer(*plots[:-1]) -> alt.layer(*plots)

Я ничего не получаю - сюжет не отображается, и вызов display не помогает. Как мне сделать это вместо этого?

Кроме того, я хотел бы видеть значение t для выбранной точки, а не t_i. Я на самом деле добавил t_i, потому что я не мог определить слайдер с произвольными значениями - все примеры, которые я видел, имеют min, max, step. Как я могу отобразить значение t, чтобы оно обновлялось с помощью ползунка?

Спасибо!

РЕДАКТИРОВАТЬ (рабочий код):

for line_name in df.line_name.unique():
  line = base.transform_filter(datum.line_name == line_name)
  slider = alt.binding_range(min=0, max=4, step=1, name='t_%s:' % line_name[1:])
  select_t_i = alt.selection_single(fields=['t_i'], bind=slider, init={'t_i': 0})
  plots += [line.mark_line(), 
            line.mark_point().add_selection(select_t_i).transform_filter(select_t_i)]
alt.layer(*plots[:-1])

1 Ответ

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

Два выбора не могут иметь одинаковое имя. Удалите name="t_i" из определения выбора (чтобы у каждого было уникальное автоматически сгенерированное имя), и оно будет работать.

...