转换¶
可视化管道中一个重要的部分是数据转换。
使用 Altair,数据转换有两种可能的途径;即
在 Python 中进行预转换
在 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)})
基于此数据创建一个图表,并使用 Altair 的
transform_calculate
API 绘制正弦和余弦曲线。对此图表使用
transform_filter
,并移除余弦曲线值小于正弦曲线值的图表区域。