Altair:无法对分层图进行分面

时间:2018-10-18 11:26:20

标签: python altair

我在documentation中读到,我可以对多层图进行构图,但是不知何故,数据会在输出图中集中在一起,并在所有构图中重复。

我可以毫不费力地面向每一层,这是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 :(得分:3)

这是由于在文档Facet section的结尾处进行了简短讨论的一个小陷阱。

您可以将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