如何在 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

我的数据集包含

国家的数量很多,但我只想显示前 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) 中的数据: