是否可以创建 Altair 绑定到数据列表元素而不是 select?
Is it possible to create an Altair binding to a datalist element instead of select?
我正在尝试在时间序列图上设置基因表达的交互式过滤器。创建这种过滤器的记录方法是将 select_single
绑定到输入表单。对于较少数量的选项,binding_select
会起作用。例如
import altair as alt
group_dropdown = alt.binding_select(options=gene_names)
group_select = alt.selection_single(fields=['gene'], bind=group_dropdown, name='Feature', init={'gene': gene_names[0]})
filter_group = chart.add_selection(group_select).transform_filter(group_select)
但是,我有大约 5 万个基因可供选择,因此下拉列表 (binding_select
) 并不是真正的选择。 <datalist>
元素将是完美的。 Input Binding 上的 vega-lite 文档暗示我 应该 能够使用任何 HTML 表单输入元素,但我无法弄清楚 Altair class 将映射到那个。
这是可能的,但有些困难,原因有二:
- 尽管 Vega 支持任意参数来形成输入,但 vega-lite 的架构禁止此类参数。这意味着您需要解决 Altair 的正常验证机制才能使用它。
- 必须将
<datalist>
注入到图表的 HTML 输出中,但没有一个很好的机制可以做到这一点。
下面是一个示例,说明如何解决这些限制并在 Altair 选择输入绑定中使用数据列表:
from IPython.display import HTML, display
import altair as alt
from vega_datasets import data
from altair.utils.display import HTMLRenderer
from altair.utils import schemapi
datalist = """
<datalist id="origin">
<option value="USA">
<option value="Europe">
<option value="Japan">
</datalist>
"""
# Allow specifications that are invalid according to the schema.
# This prevents a validation error for the `list` argument below.
schemapi.DEBUG_MODE = False
# `list` here should match the ID of the <datalist> specification.
widget = alt.binding(input='text', name='Country', list='origin')
# now create the chart as normal:
selection = alt.selection_single(fields=['Origin'], bind=widget)
color = alt.condition(selection,
alt.Color('Origin:N', legend=None),
alt.value('lightgray'))
chart = alt.Chart(data.cars.url).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
color=color,
tooltip='Name:N'
).add_selection(
selection
)
# Note the following assumes the default renderer.
alt.renderers.enable('default')
# Render the chart to HTML without validating it against the schema:
renderer = alt.renderers.get()
html = renderer(chart.to_dict(validate=False))['text/html']
# Now display the datalist and chart rendering:
display(HTML(datalist + html))
我正在尝试在时间序列图上设置基因表达的交互式过滤器。创建这种过滤器的记录方法是将 select_single
绑定到输入表单。对于较少数量的选项,binding_select
会起作用。例如
import altair as alt
group_dropdown = alt.binding_select(options=gene_names)
group_select = alt.selection_single(fields=['gene'], bind=group_dropdown, name='Feature', init={'gene': gene_names[0]})
filter_group = chart.add_selection(group_select).transform_filter(group_select)
但是,我有大约 5 万个基因可供选择,因此下拉列表 (binding_select
) 并不是真正的选择。 <datalist>
元素将是完美的。 Input Binding 上的 vega-lite 文档暗示我 应该 能够使用任何 HTML 表单输入元素,但我无法弄清楚 Altair class 将映射到那个。
这是可能的,但有些困难,原因有二:
- 尽管 Vega 支持任意参数来形成输入,但 vega-lite 的架构禁止此类参数。这意味着您需要解决 Altair 的正常验证机制才能使用它。
- 必须将
<datalist>
注入到图表的 HTML 输出中,但没有一个很好的机制可以做到这一点。
下面是一个示例,说明如何解决这些限制并在 Altair 选择输入绑定中使用数据列表:
from IPython.display import HTML, display
import altair as alt
from vega_datasets import data
from altair.utils.display import HTMLRenderer
from altair.utils import schemapi
datalist = """
<datalist id="origin">
<option value="USA">
<option value="Europe">
<option value="Japan">
</datalist>
"""
# Allow specifications that are invalid according to the schema.
# This prevents a validation error for the `list` argument below.
schemapi.DEBUG_MODE = False
# `list` here should match the ID of the <datalist> specification.
widget = alt.binding(input='text', name='Country', list='origin')
# now create the chart as normal:
selection = alt.selection_single(fields=['Origin'], bind=widget)
color = alt.condition(selection,
alt.Color('Origin:N', legend=None),
alt.value('lightgray'))
chart = alt.Chart(data.cars.url).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
color=color,
tooltip='Name:N'
).add_selection(
selection
)
# Note the following assumes the default renderer.
alt.renderers.enable('default')
# Render the chart to HTML without validating it against the schema:
renderer = alt.renderers.get()
html = renderer(chart.to_dict(validate=False))['text/html']
# Now display the datalist and chart rendering:
display(HTML(datalist + html))