aggregate
特性
// Json 版本
{
...
"transform": [
{
// Aggregate Transform
"aggregate": [
{"op": ..., "field": ..., "as": ...},
{"op": ..., "field": ..., "as": ...},
...],
"groupby": [...]
}
...
],
...
}
# Julia 版本
@vlplot(
...
transform=[{
aggregate=[
{op=..., field=..., as=...},
{op=..., field=..., as=...},
...],
groupby=[...]
},
...
],
...
)
aggregate
字段下有op
、field
、as
三个必需的属性。field
指的是操作的变量对象。as
给操作后的变量一个名称,该名称于所在的代码环境内起作用。op
支持以下操作函数。在Json
格式中函数名称使用双引号,即使用"op": "operation"
,在Julia
中语法为op=:operation
。
aggregate
可与groupby
字段连用,实现对不同的组进行操作。
operation | 解释 | operation | 解释 |
---|---|---|---|
count | 计数 | stderr | 标准误 |
valid | 对非空等数值计数 | median | 中位数 |
missing | 空值或未定义字段值 | q1 | 下四分位数 |
distinct | 对不同字段的值计数 | q3 | 上四分位数 |
sum | 求和 | ci0 | 根据bootstrapped方法得到的95%下置信区间 |
mean | 均值 | ci1 | 根据bootstrapped方法得到的95%上置信区间 |
average | 均值 | min | 最小值 |
variance | 样本方差 | max | 最大值 |
variancep | 总体方差 | argmin | 达到最小值的数据对象 |
stdev | 样本标准差 | argmax | 达到最大值的数据对象 |
stdevp | 总体标准差 |
栗子
一个简单的例子:画出 poplulation 数据集中 150 年各年龄段的平均人口数量。
using VegaLite, VegaDatasets, DataFrames
popu = DataFrame(dataset("population"))
describe(popu[:,1]) # 1850-2000 年 -> 151 年
dataset("population") |>
@vlplot(
transform=[
{
aggregate=[
{op=:mean, field=:people, as=:mean_people} # 每个年龄段的人口均值
],
groupby=[:age] # 以年龄段分组
}
],
:rule,
x="age:o",
y="mean_people:q",
)
Summary Stats:
Mean: 1927.333333
Minimum: 1850.000000
1st Quartile: 1880.000000
Median: 1930.000000
3rd Quartile: 1970.000000
Maximum: 2000.000000
Length: 570
Type: Int64
应用
一个带有最大值、最小值触须的箱线图 ↓
using VegaLite, VegaDatasets
dataset("population") |>
@vlplot(
transform=[{
aggregate=[
{op=:q1, field=:people, as=:lowerBox},
{op=:q3, field=:people, as=:upperBox},
{op=:median, field=:people, as=:midBox},
{op=:min, field=:people, as=:lowerWhisker},
{op=:max, field=:people, as=:upperWhisker}
],
groupby=[:age]
}]
) +
@vlplot(
mark={:rule, style=:boxWhisker},
y={"lowerWhisker:q", axis={title="population"}},
y2="lowerBox:q",
x="age:o"
) +
@vlplot(
mark={:rule, style=:boxWhisker},
y="upperBox:q",
y2="upperWhisker:q",
x="age:o"
) +
@vlplot(
mark={:bar, style=:box},
y="lowerBox:q",
y2="upperBox:q",
x="age:o",
size={value=5}
) +
@vlplot(
mark={:tick, style=:boxMid},
y="midBox:q",
x="age:o",
color={value=:white},
size={value=5}
)