Фильтр altair heatmap с тепловой заливкой и текстовым значением - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь создать тепловую карту, используя библиотеку Altair, но я пытаюсь отфильтровать мои данные с помощью ползунка для разных представлений. Ползунок хорошо работает со стандартной картой цветов, но когда я пытаюсь добавить текст в поля для описания значений в каждой ячейке, я получаю ошибку javascript ниже. (Добавление текста в тепловую карту прекрасно работает без какого-либо ползунка фильтра.)

import altair as alt
import pandas as pd
source = pd.DataFrame({'year':[2017, 2017, 2018, 2018],
                       'age':[1, 2, 1, 2],
                       'y':['a', 'a', 'a', 'a'],
                       'n':[1, 2, 3, 4]})

slider = alt.binding_range(min=2017, max=2018, step=1)
select_year = alt.selection_single(name="my_year_slider", fields=['year'], bind=slider)
base = alt.Chart(source).add_selection(select_year).transform_filter(select_year)

heatmap = base.mark_rect().encode(
    x='age:O',
    y='y:O',
    color='n:Q')

text = base.mark_text(baseline='middle').encode(
    x='age:O',
    y='y:O',
    text='n:Q')

heatmap + text

Возвращает Javascript Error: Duplicate signal name: "my_year_slider_tuple"

1 Ответ

0 голосов
/ 09 января 2019

Поскольку вы добавили выделение к базовой диаграмме, а затем наложили на него две копии, выделение определяется дважды. Решение состоит в том, чтобы определить выбор только один раз; как то так:

import altair as alt
import pandas as pd
source = pd.DataFrame({'year':[2017, 2017, 2018, 2018],
                       'age':[1, 2, 1, 2],
                       'y':['a', 'a', 'a', 'a'],
                       'n':[1, 2, 3, 4]})

slider = alt.binding_range(min=2017, max=2018, step=1)
select_year = alt.selection_single(name="my_year_slider", fields=['year'], bind=slider)

base = alt.Chart(source).encode(
    x='age:O',
    y='y:O',
).transform_filter(select_year)

heatmap = base.mark_rect().encode(color='n:Q').add_selection(select_year)

text = base.mark_text(baseline='middle').encode(text='n:Q')

heatmap + text
...