Altair:用于分层图的两个独立滑块

Altair: two independent sliders for a layered plot

我有一个像这样的数据框(code 生成数据):

我想比较两条线 - l1l2,两者都取决于参数 t。每行有五个 t 采样值,编号为 t_i。我想绘制两条线,并为每条线突出显示一个采样点。要突出显示的点应使用两个滑块设置 - 每行一个。

我可以在没有滑块的情况下使用它:

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])

我得到了预期的结果:

但是如果我更改最后一行以实际添加第二个滑块:

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])

两个选择不能重名。从您的选择定义中删除 name="t_i"(这样每个人都会有一个唯一的自动生成的名称),它将起作用。