Altair:无法分面分层图
Altair: Can't facet layered plots
我在 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
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 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')
我在 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
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 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')