Альтаир: не может огранить многослойные участки - PullRequest
0 голосов
/ 18 октября 2018

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

Я могу огранитькаждый слой без проблем, вот пример с набором данных 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

enter image description here

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

enter image description here

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

combined = horse + miles

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

enter image description here Я что-то не так делаю?

1 Ответ

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

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

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

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

В качестве примечания, у 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')

enter image description here

...