Можно ли вместо select создать привязку Altair к элементу datalist?

Я пытаюсь настроить интерактивный фильтр экспрессии генов на графике временных рядов. Документированный метод создания такого фильтра - это привязка 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)

Однако у меня есть ~ 50К генов, которые можно выбрать, так что раскрывающийся список (binding_select) на самом деле не вариант. Элемент <datalist> был бы идеальным. Документы vega-lite на Input Binding подразумевают, что я должен иметь возможность использовать любой элемент ввода HTML-формы, но я не могу определить класс Altair, который будет ему соответствовать.


person A Richter    schedule 23.04.2020    source источник


Ответы (1)


Это возможно, но несколько сложно по двум причинам:

  • Хотя 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))

введите здесь описание изображения

person jakevdp    schedule 23.04.2020