查找#

查找转换通过从另一个数据源查找值来扩展主要数据源;它类似于单侧连接。可以使用 Chart.transform_lookup() 方法在图表的顶层添加查找。

举个例子,假设你有两个你想组合并绘制的数据源:一个是包含人名及其身高和体重的列表,另一个是关于他们属于哪个组的信息。这些示例数据可在 vega_datasets 中获取。

from vega_datasets import data
people = data.lookup_people()
groups = data.lookup_groups()

我们知道如何分别可视化这些数据集;例如

import altair as alt

top = alt.Chart(people).mark_square(size=200).encode(
    x=alt.X('age:Q').scale(zero=False),
    y=alt.Y('height:Q').scale(zero=False),
    color='name:N',
    tooltip='name:N'
).properties(
    width=400, height=200
)

bottom = alt.Chart(groups).mark_rect().encode(
    x='person:N',
    y='group:O'
).properties(
    width=400, height=100
)

alt.vconcat(top, bottom)

如果我们想绘制同时引用两个数据集的特征(例如,每个组的平均年龄),我们需要将这两个数据集组合起来。这可以通过数据预处理步骤(使用 pandas 中提供的工具)完成,或者作为可视化的一部分(使用 Altair 中的 LookupTransform)完成。

使用 pandas.merge 组合数据集#

pandas 提供了广泛的工具用于合并和连接数据集;有关详细示例,请参阅 合并、连接和串联。对于上述数据,我们可以按如下方式合并数据并创建一个组合图表

import pandas as pd
merged = pd.merge(groups, people, how='left',
                  left_on='person', right_on='name')

alt.Chart(merged).mark_bar().encode(
    x='mean(age):Q',
    y='group:O'
)

我们指定一个左连接,这意味着对于 groups 中“person”列的每个条目,我们在 people 中查找“name”列并将该条目添加到数据中。由此,我们可以轻松创建一个条形图,表示每个组的平均年龄。

使用查找转换组合数据集#

对于某些数据源(例如 URL 可用的数据或流式传输的数据),最好有一种在不下载数据进行 pandas 预处理的情况下连接数据的方法。这就是 Altair 的 transform_lookup() 的用武之地。要通过在图表规范本身中组合数据集来重现上述组合图,我们可以按如下方式进行

alt.Chart(groups).mark_bar().encode(
    x='mean(age):Q',
    y='group:O'
).transform_lookup(
    lookup='person',
    from_=alt.LookupData(data=people, key='name',
                         fields=['age', 'height'])
)

这里 lookup 指定了 groups 数据集中我们将匹配的字段名称,而 from_ 参数指定了一个 LookupData 结构,我们在其中提供了第二个数据集、查找键以及我们想要提取的字段。

示例:地理可视化中的查找转换#

查找转换对于地理可视化尤其重要,在这种情况下,通常需要将表格数据集与指定要可视化的地理边界的数据集结合起来;例如,这是一个美国各县失业率的可视化图表

import altair as alt
from vega_datasets import data

counties = alt.topo_feature(data.us_10m.url, 'counties')
unemp_data = data.unemployment.url

alt.Chart(counties).mark_geoshape().encode(
    color='rate:Q'
).transform_lookup(
    lookup='id',
    from_=alt.LookupData(unemp_data, 'id', ['rate'])
).properties(
    projection={'type': 'albersUsa'},
    width=500, height=300
)

转换选项#

transform_lookup() 方法基于 LookupTransform 类构建,该类具有以下选项

点击显示表格

属性

类型

描述

as

anyOf(FieldName, array(FieldName))

用于存储查找数据值的输出字段。

对于数据查找,如果已指定 from.fields(将使用这些字段名称),则此属性可以留空;如果未指定 from.fields,则 as 必须是字符串。

对于选择查找,此属性是可选的:如果未指定,查找的值将存储在以选择命名的属性下;如果指定,则必须与 from.fields 对应。

default

任意类型

如果查找失败,则使用的默认值。

默认值: null

from

anyOf(LookupData, LookupSelection)

用于次要数据引用的数据源或选择。

lookup

字符串

主要数据源中的键。