Интерактивный выбор сюжета не освещает точки - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь сгенерировать 2 участка в Альтаире с одинаковыми selection.

Я хотел бы построить точечные и гистограммы населения (y) и возраста (x). Я использую встроенный набор данных Altair population. Население представляет собой сумму столбца people в этом наборе данных. В наборе данных есть столбцы для year, people, age и sex. Я могу получить общее заполнение, используя sum(people) и построить это как y против age. Для гистограммы я могу нарисовать аналогично sum(people) в зависимости от возраста и цвета, используя столбец sex.

Я пытаюсь настроить кисть / выделение между этими 2 графиками, чтобы можно было подсветить график рассеяния, и одновременно график гистограммы обновляется в соответствии с этим выделением. Тем не менее, я застрял со следующей проблемой

Я использую многослойную диаграмму , пример из документации Altair для примера.

Вот код

import altair as alt
from altair.expr import datum, if_
from vega_datasets import data
interval = alt.selection_interval(encodings=['x', 'y'])

df = data.population.url

scatter = alt.Chart(df).mark_point().encode(
    alt.X('age:O', axis=alt.Axis(title='')),
    y='sum(people)',
    color=alt.condition(interval, 'sex:N', alt.value('lightgrey'))
).transform_filter(
    filter = datum.year == 2000
).transform_calculate(
    "sex", if_(datum.sex == 2, 'Female', 'Male')
).properties(
    selection=interval
)

bar = alt.Chart(df).mark_bar(opacity=0.7).encode(
    alt.X('age:O', scale=alt.Scale(rangeStep=17)),
    alt.Y('sum(people)', stack=None),
    color=alt.condition(interval, 'sex:N', alt.value('lightgrey')),
).transform_filter(
    filter = datum.year == 2000
).transform_calculate(
    "sex", if_(datum.sex == 2, 'Female', 'Male')
).properties(height=100, width=400)

scatter & bar

Я изменил код в примере документации. Сначала я создаю точечный график, а затем использую цвет на основе selection. Затем я определяю гистограмму тех же двух столбцов и снова использую selection, чтобы указать цвет. Вот вывод

enter image description here

Теперь я хотел бы перетащить прямоугольник по верхнему (рассеянному) графику, чтобы выбрать несколько точек, и одновременно нижняя (столбчатая) диаграмма должна обновиться на основе selection. Когда я перетаскиваю верхний график, чтобы сделать selection, это происходит

enter image description here

Проблемы

  1. После перетаскивания для выделения на верхнем графике цвета (внутри и снаружи выделения) на обоих графиках изменяются на lightgrey. Я ожидал, что на обоих графиках внутри выделения / кисти будет подсвечено, но снаружи должно быть lightgrey.

Как я могу получить выделение, подсвеченное одновременно на верхнем и нижнем графиках?

EDIT

Я хочу это поведение , когда кисть / выделение на одном графике одновременно подсвечивается на втором (связанном) графике.

Версии пакета:

Python = 3.6
Altair = 2.2
Jupyter = 5.6

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Основываясь на (и адаптируя) ответе @jakevdp выше, я попробовал нечто похожее на этот пример из раздела Интерактивные диаграммы галереи документов.

Вместо использования объекта base я использовал функцию vconcat, которая соединяет экземпляры Chart и передает преобразование и данные в объект vconcat. Вот подход

import altair as alt
from altair.expr import datum, if_
from vega_datasets import data
interval = alt.selection_interval(encodings=['x', 'y'])

scatter = alt.Chart().mark_point().encode(
    alt.X('age:O', title=''),
    y='population:Q',
    color=alt.condition(interval, 'sex:N', alt.value('lightgrey'))
).properties(
    selection=interval
)

bar = alt.Chart().mark_bar(opacity=0.7).encode(
    alt.X('age:O', scale=alt.Scale(rangeStep=17)),
    alt.Y('population:Q'),
    color=alt.condition(interval, 'sex:N', alt.value('lightgrey')),
).properties(height=100, width=400)

alt.vconcat(scatter, bar,
    data=data.population.url
).transform_filter(
    filter = datum.year == 2000
).transform_calculate(
    "sex", if_(datum.sex == 2, 'Female', 'Male')
).transform_aggregate(
    population="sum(people)",
    groupby=['age', 'sex']
)

Этот подход, по-видимому, дает ту же функциональность, что и answer.i.e @ jakevdp. можно сделать выбор на диаграмме рассеяния (вверху), и при необходимости это будет отражено в гистограмме (внизу).

0 голосов
/ 09 сентября 2018

Чтобы инициировать выборку для агрегированного значения, лучше всего использовать агрегированное преобразование, чтобы определить это количество, чтобы оно было доступно для всей диаграммы.

Вот пример:

import altair as alt
from altair.expr import datum, if_
from vega_datasets import data

interval = alt.selection_interval(encodings=['x', 'y'])


base = alt.Chart(data.population.url).transform_filter(
    filter = datum.year == 2000
).transform_calculate(
    "sex", if_(datum.sex == 2, 'Female', 'Male')
).transform_aggregate(
    population="sum(people)",
    groupby=['age', 'sex']
)

scatter = base.mark_point().encode(
    alt.X('age:O', title=''),
    y='population:Q',
    color=alt.condition(interval, 'sex:N', alt.value('lightgrey'))
).properties(
    selection=interval
)

bar = base.mark_bar(opacity=0.7).encode(
    alt.X('age:O', scale=alt.Scale(rangeStep=17)),
    alt.Y('population:Q'),
    color=alt.condition(interval, 'sex:N', alt.value('lightgrey')),
).properties(height=100, width=400)

scatter & bar

Обратите внимание, что я убрал фильтрацию с помощью выбора интервала на нижнем графике, потому что это не то поведение, которое вы описали.

...