Возможно ли создать привязку Altair к элементу списка данных вместо select? - PullRequest
1 голос
/ 23 апреля 2020

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

1 Ответ

0 голосов
/ 24 апреля 2020

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

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

enter image description here

...