如何在 Vega-Lite 中将数据集分组为 top-K 和其他数据集
How to group a dataset into top-K plus others in Vega-Lite
我想创建一个类似于
https://vega.github.io/vega-lite/examples/stacked_bar_weather.html
我的数据集包含
- 日期 - x(时间,1 年,粒度为 1 天)
- 命中 - y(定量)
- 国家 - 颜色(标称)
国家的数量很多,但我只想显示前 5 个和
将其余的分组到标签 OTHER 下。我想select超过前5名
一年的完整时间段(不是每一天的前 5 名)。
我能够 select 使用以下 top-5 转换的 top-5:
"transform" : [
{
"aggregate" : [ {"op": "sum", "field": "hit", "as": "hit_sum_by_country"} ],
"groupby" : ["country"]
},
{
"window": [ {"op": "row_number", "as": "rank"} ],
"sort": [ {"field": "hit_sum_by_country", "order": "descending"} ]
},
{
"calculate": "datum.rank < 5 ? datum.country : 'others'", "as" : "top_country"
}
],
然而,这会破坏我的原始数据。
所以看起来我需要在侧面进行 top-5 转换
然后以某种方式将 "top_country"
注入原始数据集。
这可能吗?或者我应该在 vega 之外做这个(即
在 javascript 或服务器端)
更新:vega editor 中的示例。由于颜色编码的国家/地区数量众多,该图表很难阅读。我想 select 前 5 名,然后将所有其他人归为一 label/color OTHER.
UPDATE-2 另一个 example 从评论
链接
我认为你可以通过以下转换完成你想做的事情:
"transform": [
{
"joinaggregate": [{"op": "sum", "field": "hits", "as": "hit_sum_by_country"}],
"groupby": ["country"]
},
{
"window": [{"op": "row_number", "as": "rank"}],
"sort": [{"field": "hit_sum_by_country", "order": "descending"}],
"groupby": ["date"]
},
{"calculate": "datum.rank <= 5 ? datum.country : 'Other'", "as": "country"}
],
注意:这预先假设每个国家在每个日期都有一个条目;如果没有,您还必须在 window 转换之前添加插补转换。
这是结果 (view in editor):
编辑:如果您需要估算缺失值,转换可能如下所示:
"transform": [
{"impute": "hits", "key": "country", "value": 0, "groupby": ["date"]},
{
"joinaggregate": [
{"op": "sum", "field": "hits", "as": "hit_sum_by_country"}
],
"groupby": ["country"]
},
{
"window": [{"op": "row_number", "as": "rank"}],
"sort": [{"field": "hit_sum_by_country", "order": "descending"}],
"groupby": ["date"]
},
{
"calculate": "datum.rank <= 5 ? datum.country : 'Other'",
"as": "top_country"
}
],
结果看起来像这样,使用更新示例 (view in editor) 中的数据:
我想创建一个类似于 https://vega.github.io/vega-lite/examples/stacked_bar_weather.html
我的数据集包含
- 日期 - x(时间,1 年,粒度为 1 天)
- 命中 - y(定量)
- 国家 - 颜色(标称)
国家的数量很多,但我只想显示前 5 个和 将其余的分组到标签 OTHER 下。我想select超过前5名 一年的完整时间段(不是每一天的前 5 名)。
我能够 select 使用以下 top-5 转换的 top-5:
"transform" : [
{
"aggregate" : [ {"op": "sum", "field": "hit", "as": "hit_sum_by_country"} ],
"groupby" : ["country"]
},
{
"window": [ {"op": "row_number", "as": "rank"} ],
"sort": [ {"field": "hit_sum_by_country", "order": "descending"} ]
},
{
"calculate": "datum.rank < 5 ? datum.country : 'others'", "as" : "top_country"
}
],
然而,这会破坏我的原始数据。
所以看起来我需要在侧面进行 top-5 转换
然后以某种方式将 "top_country"
注入原始数据集。
这可能吗?或者我应该在 vega 之外做这个(即
在 javascript 或服务器端)
更新:vega editor 中的示例。由于颜色编码的国家/地区数量众多,该图表很难阅读。我想 select 前 5 名,然后将所有其他人归为一 label/color OTHER.
UPDATE-2 另一个 example 从评论
链接我认为你可以通过以下转换完成你想做的事情:
"transform": [
{
"joinaggregate": [{"op": "sum", "field": "hits", "as": "hit_sum_by_country"}],
"groupby": ["country"]
},
{
"window": [{"op": "row_number", "as": "rank"}],
"sort": [{"field": "hit_sum_by_country", "order": "descending"}],
"groupby": ["date"]
},
{"calculate": "datum.rank <= 5 ? datum.country : 'Other'", "as": "country"}
],
注意:这预先假设每个国家在每个日期都有一个条目;如果没有,您还必须在 window 转换之前添加插补转换。
这是结果 (view in editor):
编辑:如果您需要估算缺失值,转换可能如下所示:
"transform": [
{"impute": "hits", "key": "country", "value": 0, "groupby": ["date"]},
{
"joinaggregate": [
{"op": "sum", "field": "hits", "as": "hit_sum_by_country"}
],
"groupby": ["country"]
},
{
"window": [{"op": "row_number", "as": "rank"}],
"sort": [{"field": "hit_sum_by_country", "order": "descending"}],
"groupby": ["date"]
},
{
"calculate": "datum.rank <= 5 ? datum.country : 'Other'",
"as": "top_country"
}
],
结果看起来像这样,使用更新示例 (view in editor) 中的数据: