У меня есть такой фрейм данных ( код для генерации данных):
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])
Я получаю ожидаемый результат:
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])