Я прочитал в документации, что я могу охарактеризовать многослойный сюжет, но так или иначе данные объединяются в выходной график и повторяются во всех аспектах.
Я могу без проблем разбивать каждый слой, вот пример с набором данных 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
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
Но при объединении все данные появляются на каждом сюжете
combined = horse + miles
chart = alt.hconcat()
for origin in cars.Origin.unique():
chart |= combined.transform_filter(datum.Origin == origin).properties(title=origin)
chart
Я делаю что-то не так?
Это связано с небольшим количеством вопросов, которые очень кратко обсуждались в конце раздела 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')