выбор альтаира в нескольких графиках - PullRequest
0 голосов
/ 14 октября 2018

У меня есть фрейм данных со столбцами: 'sex', 'urb', 'age', 'time', 'value'.

Мне нужно выбрать один элемент из 'sex' и 'urb'и кратно столбцу' age ', затем создайте интерактивную линейную диаграмму с' time 'на оси x,' value 'для y и age в легенде.

Я добавляю selection_multi () для разделения mark_rect (например,y = 'sex: O', без оси x) для каждого столбца 'sex', 'urb' и 'age'.

Я ожидаю, что mark_line () нарисует линии на основе selection_multi ().Например, если я выберу:

  1. "Мужчина" из "пола"
  2. "Город" из "urb"
  3. "20 с" и "40 с" из "возраст

затем 2 линии:

  1. Мужской - Городской - 20 с
  2. Мужской - Городской - 40 с

.

Однако выбор не работает, как я ожидаю.Например, если я выберу «Male» из «sex» mark_rect () и «Urban» из «urb» mark_rect (), тогда «Female» автоматически будет выбран в «sex» mark_rect ().Невозможно выбрать «Мужской» И «Городской», даже если во фрейме данных есть строки с «Мужской» и «Городской».

Что я делаю не так?

Панель управления должна выглядеть следующим образом

import altair as alt
import pandas as pd
import itertools as it

levels = it.product(['Male', 'Female'], ['Urban', 'Rural'], ['20s', '30s', '40s'], ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'])
data = pd.DataFrame(list(levels), columns=['sex', 'urb', 'age', 'time'])
data['value'] = [x for x in range(1, 13) for y in range(6)]

selector = alt.selection_multi(fields=['sex', 'urb', 'age'])

ax = alt.Axis(offset=-60, orient='right', domain=False, ticks=False, title=None)
clr = alt.condition(selector, alt.value('lightblue'), alt.value('lightgray'), legend=None)

sex = alt.Chart(data, title='sex (single selection)').mark_rect().encode(y=alt.Y('sex:N', axis=ax), color=clr).properties(width=60, height=40).add_selection(selector)
urb = alt.Chart(data, title='urb (single selection)').mark_rect().encode(y=alt.Y('urb:N', axis=ax), color=clr).properties(width=60, height=40).add_selection(selector)
age = alt.Chart(data, title='age (multi selection) ').mark_rect().encode(y=alt.Y('age:N', axis=ax), color=clr).properties(width=60, height=60).add_selection(selector)

line = alt.Chart(data).mark_line().encode(x='time:O', y='value:Q', color='age:O').transform_filter(selector).properties(width=200, height=200)


sex_urb = alt.Chart(data).mark_rect().encode(x='sex:O', y='urb:O').transform_filter(selector).properties(width=40, height=40)
sex_age = alt.Chart(data).mark_rect().encode(x='sex:O', y='age:O').transform_filter(selector).properties(width=40, height=40)
urb_age = alt.Chart(data).mark_rect().encode(x='urb:O', y='age:O').transform_filter(selector).properties(width=40, height=40)
sex_urb_base = alt.Chart(data).mark_rect().encode(x='sex:O', y='urb:O', color=alt.value('white')).properties(width=40, height=40)
sex_age_base = alt.Chart(data).mark_rect().encode(x='sex:O', y='age:O', color=alt.value('white')).properties(width=40, height=40)
urb_age_base = alt.Chart(data).mark_rect().encode(x='urb:O', y='age:O', color=alt.value('white')).properties(width=40, height=40)

alt.hconcat(alt.vconcat(sex, urb, age), alt.vconcat(sex_urb_base + sex_urb, sex_age_base + sex_age, urb_age_base + urb_age), line)

1 Ответ

0 голосов
/ 15 октября 2018

Ваша проблема в том, что у вас есть один селектор, который срабатывает на 'sex', 'urb' и 'age'.Из вашего описания кажется, что вам нужно несколько селекторов, которые срабатывают независимо.

Попробуйте создать три селектора, например,

selector_sex = alt.selection_single(fields=['sex'])
selector_urb = alt.selection_single(fields=['urb'])
selector_age = alt.selection_multi(fields=['age'])

и использовать их в различных местах на панели инструментов.

...