python - Altair:不能刻面分层地块
问题描述
我在文档中读到我可以对多层图进行刻面,但不知何故,数据在输出图中集中在一起,并在所有方面重复。
我可以毫无问题地处理每一层,这是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
对象作为子对象。子级可以从父级继承数据,也可以指定自己的数据,在这种情况下,父级数据将被忽略。
现在,因为您分别为每个子图表指定了数据,所以它们会忽略任何来自父图表的数据或转换。解决此问题的方法是仅在 parent中指定数据。
附带说明一下,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')
推荐阅读
- javascript - 第一个索引图像被渲染,它应该在 componentDidMount 加载之前在屏幕上显示一段时间
- javascript - 使用 Jquery 检查用户是否已将项目添加到列表中
- python - Python ColumnTransformer SettingWithCopyWarning
- spring - spring boot rest 下载 docx
- c# - C# SerialPort 多线程发送/接收冲突
- c++ - 即使在程序结束后,我如何保持变量的值?
- postgresql - 使用逻辑复制验证 postgres 升级
- c - 如何检查一个号码是否只有唯一数字?
- laravel - 如何根据另一个表单域的数据验证表单域?- Laravel 6
- c# - S7.Net Plus WriteBits 不适用于位寻址