Получить сумму за выбор в Альтаир - PullRequest
1 голос
/ 27 марта 2020

У меня есть временной ряд значений стоимости, и я хотел бы получить сумму затрат для диапазона выбранных дат. Выбор интервала работает отлично, но как мне получить доступ к выбранным датам?

brush = alt.selection(type='interval', encodings=['x'])

chart = alt.Chart(forecast).mark_bar().encode(
            x='dates:T',
            y='costs:Q',
            color='type:N',
        ).add_selection(
            brush
        )

enter image description here

1 Ответ

3 голосов
/ 28 марта 2020

Вы можете использовать текстовую метку вместе с преобразованием фильтра , чтобы отобразить сумму значений в выделении. Например:

import altair as alt
import pandas as pd
import numpy as np

data = pd.DataFrame({
    "dates": pd.date_range('2019-04-01', freq='M', periods=20),
    "costs": np.linspace(1000, 5000, 20),
})

brush = alt.selection(type='interval', encodings=['x'])

chart = alt.Chart(data).mark_bar().encode(
    x='dates:T',
    y='costs:Q',
).add_selection(
    brush
)

text = alt.Chart(data).transform_filter(brush).mark_text(
    align='left',
    baseline='top',
).encode(
    x=alt.value(5),
    y=alt.value(5),
    text=alt.Text('sum(costs):Q', format='.1f'),
)

chart + text

enter image description here


Редактировать: если вы хотите отобразить границы выделения в тексте, это не совсем просто, но Вы можете сделать это с помощью вычисления преобразования вместе с соответствующим выражением vega строкой, которая относится к выбору по имени.

Например:

brush = alt.selection(type='interval', encodings=['x'], name='sel')

chart = alt.Chart(data).mark_bar().encode(
    x='dates:T',
    y='costs:Q',
).add_selection(
    brush
)

text = alt.Chart(data).transform_filter(
    brush
).transform_aggregate(
    total='sum(costs)'
).transform_calculate(
    date_range="sel.dates ? monthAbbrevFormat(month(sel.dates[0])) + ' to ' + monthAbbrevFormat(month(sel.dates[1])) : 'all'",
    text="'Total for ' + datum.date_range + ': ' + format(datum.total, '.0f')"  
).mark_text(
    align='left',
    baseline='top',
).encode(
    x=alt.value(5),
    y=alt.value(5),
    text=alt.Text('text:N'),
)

chart + text

enter image description here

...