Altair:用于分层图的两个独立滑块
Altair: two independent sliders for a layered plot
我有一个像这样的数据框(code 生成数据):
我想比较两条线 - l1
和 l2
,两者都取决于参数 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"
(这样每个人都会有一个唯一的自动生成的名称),它将起作用。
我有一个像这样的数据框(code 生成数据):
我想比较两条线 - l1
和 l2
,两者都取决于参数 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"
(这样每个人都会有一个唯一的自动生成的名称),它将起作用。