У меня есть фрейм данных со столбцами: '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 ().Например, если я выберу:
- "Мужчина" из "пола"
- "Город" из "urb"
- "20 с" и "40 с" из "возраст
затем 2 линии:
- Мужской - Городской - 20 с
- Мужской - Городской - 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)