Альтаир: не может огранить многослойные участки

1

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

Я могу без проблем разбивать каждый слой, вот пример с набором данных cars:

import altair as alt
from altair import datum
from vega_datasets import data
cars = data.cars()

horse = alt.Chart(cars).mark_point().encode(
    x = 'Weight_in_lbs',
    y = 'Horsepower'
)

chart = alt.hconcat()
for origin in cars.Origin.unique():
    chart |= horse.transform_filter(datum.Origin == origin).properties(title=origin)
chart

Изображение 174551

miles = alt.Chart(cars).mark_point(color='red').encode(
    x = 'Weight_in_lbs',
    y = 'Miles_per_Gallon'
)

chart = alt.hconcat()
for origin in cars.Origin.unique():
    chart |= miles.transform_filter(datum.Origin == origin).properties(title=origin)
chart

Изображение 174551

Но при объединении все данные появляются на каждом сюжете

combined = horse + miles

chart = alt.hconcat()
for origin in cars.Origin.unique():
    chart |= combined.transform_filter(datum.Origin == origin).properties(title=origin)
chart

Изображение 174551 Я делаю что-то не так?

Теги:
altair

1 ответ

2
Лучший ответ

Это связано с небольшим количеством вопросов, которые очень кратко обсуждались в конце раздела Facet в документах.

Вы можете подумать о многоуровневой диаграмме в Altair как иерархии с объектом LayerChart как родительским, а каждый отдельный объект Chart - LayerChart. Дети могут либо наследовать данные от родителя, либо указать свои собственные данные, и в этом случае родительские данные игнорируются.

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

В качестве дополнительной заметки Altair также имеет ярлык для ручной фильтрации и конкатенации, которую вы используете здесь: метод facet(). Вот пример объединения всех этих вопросов:

import altair as alt
from vega_datasets import data
cars = data.cars()

horse = alt.Chart().mark_point().encode(
    x = 'Weight_in_lbs',
    y = 'Horsepower'
)

miles = alt.Chart().mark_point(color='red').encode(
    x = 'Weight_in_lbs',
    y = 'Miles_per_Gallon'
)

alt.layer(horse, miles, data=cars).facet(column='Origin')

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню