转换

可视化管道中一个重要的部分是数据转换

使用 Altair,数据转换有两种可能的途径;即

  1. 在 Python 中进行预转换

  2. 在 Altair/Vega-Lite 中进行转换

import altair as alt

计算转换

举个例子,让我们来看看转换一些输入数据,这些数据编码方式可能不太直观。population 数据集按年份、性别和年龄列出了汇总的美国人口普查数据,但性别被列为“1”和“2”,这使得图表标签不是特别直观

from vega_datasets import data
population = data.population()
population.head()
年份 年龄 性别 人口
0 1850 0 1 1483789
1 1850 0 2 1450376
2 1850 5 1 1411067
3 1850 5 2 1359668
4 1850 10 1 1260099
alt.Chart(population).mark_bar().encode(
    x='year:O',
    y='sum(people):Q',
    color='sex:N'
)

解决这个问题的一种方法是在 Python 中使用 Pandas 工具重新映射这些列名;例如

population['men_women'] = population['sex'].map({1: 'Men', 2: 'Women'})

alt.Chart(population).mark_bar().encode(
    x='year:O',
    y='sum(people):Q',
    color='men_women:N'
)

但 Altair 也设计用于处理基于 URL 的数据,在这种情况下无法进行此类预处理。在这种情况下,最好将转换作为图表规范的一部分。这里可以通过 transform_calculate 方法来完成,该方法接受一个 Vega Expression,本质上是一个可以包含 JavaScript 操作子集的字符串

# undo our addition of a column above...
population = population.drop('men_women', axis=1)
alt.Chart(population).mark_bar().encode(
    x='year:O',
    y='sum(people):Q',
    color='men_women:N'
).transform_calculate(
    men_women='datum.sex == 1 ? "Men" : "Women"'
)

一个可能令人困惑的地方是“datum”一词的存在:这仅仅是 Vega 表达式引用数据行的方式约定。

如果您更喜欢在 Python 中构建这些表达式,Altair 提供了一个轻量级的 API 来实现这一点

from altair.expr import datum, if_

alt.Chart(population).mark_bar().encode(
    x='year:O',
    y='sum(people):Q',
    color='men_women:N'
).transform_calculate(
    men_women=if_(datum.sex == 1, "Men", "Women")
)

过滤转换

过滤转换类似。例如,假设您想创建一个仅包含这些人口普查记录中男性人口的图表。如上所述,这可以在 Pandas 中完成,但在图表规范中也能进行此操作会很有用。这可以通过 transform_filter() 方法来实现

alt.Chart(population).mark_bar().encode(
    x='year:O',
    y='sum(people):Q',
).transform_filter(
    datum.sex == 1
)

我们之前见过这个 transform_filter 方法,当时我们根据选择的结果进行过滤。

其他转换

还有其他转换方法可用,虽然我们在这里不会演示它们,但在 Altair 的转换文档中提供了示例。

Altair 提供了许多有用的转换。有些会非常熟悉

  • transform_aggregate()

  • transform_bin()

  • transform_timeunit()

这三个转换正好实现了我们在 03-Binning-and-aggregation 中讨论过的操作类型,不同之处在于它们会创建一个新的命名值,可以在图表中的多个位置引用。

还有许多其他转换,例如

  • transform_lookup():这允许您对多个数据集执行单侧连接。它经常用于地理可视化,例如,将数据(如州内的失业率)连接到用于表示该数据的地理区域数据。

  • transform_window():这允许您对滑动窗口进行聚合,例如计算数据的局部平均值。它最近才添加到 Vega-Lite 中,因此 Altair 中此转换的 API 尚不十分方便。

请再次访问转换文档以获取更完整的列表。

练习

获取以下数据

import pandas as pd
import numpy as np
x = pd.DataFrame({'x': np.linspace(-5, 5)})
  1. 基于此数据创建一个图表,并使用 Altair 的 transform_calculate API 绘制正弦和余弦曲线。

  2. 对此图表使用 transform_filter,并移除余弦曲线值小于正弦曲线值的图表区域。