转换中的 Vega-lite 多重聚合

标签 vega vega-lite

我想在转换中实现两个 diff 聚合,因为它们具有不同的 groupby 条件,但使用 vega-lite 似乎不可能

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "data": {

      {"response":200,"request":"/ST"},
      {"response":500,"request":"/ST"},
      {"response":200,"request":"/PP"},
      {"response":500,"request":"/PP"},
      {"response":200,"request":"/CP"},
      {"response":200,"request":"/CP"},
      {"response":500,"request":"/CP"},
      {"response":500,"request":"/CP"},
      {"response":500,"request":"/CP"},
      {"response":500,"request":"/CP"},
      {"response":500,"request":"/CP"},
      {"response":500,"request":"/CP"},
      {"response":503,"request":"/CP"},
      {"response":503,"request":"/CP"},
      {"response":503,"request":"/CP"}

  "transform": [
    {
      "aggregate": [{
       "op": "count",
       "as": "response_count"
      }],
      "groupby": ["response","request"]
    },
    {
      "aggregate": [{
       "op": "count",
       "as": "response_c"
      }],
      "groupby": ["request"]
    }
     ],

     {"mark": "bar",
      "encoding": {
        "x": {"field": "response_count", "type": "quantitative", "stack": "zero"},
        "y": {"field": "request", "type": "nominal"},
        "color": {"field": "response", "type": "nominal"}}
}

有什么办法可以实现吗?是否支持这样的多个聚合?

最佳答案

是的,支持这样的多个聚合,但是你的图表最后有未定义的字段,因为你没有在你的聚合中引用它们。您从这些数据开始:

[
  {"response": 200, "request": "/ST"},
  {"response": 500, "request": "/ST"},
  {"response": 200, "request": "/PP"},
  {"response": 500, "request": "/PP"},
  {"response": 200, "request": "/CP"},
  {"response": 200, "request": "/CP"},
  {"response": 500, "request": "/CP"},
  {"response": 500, "request": "/CP"},
  {"response": 500, "request": "/CP"},
  {"response": 500, "request": "/CP"},
  {"response": 500, "request": "/CP"},
  {"response": 500, "request": "/CP"},
  {"response": 503, "request": "/CP"},
  {"response": 503, "request": "/CP"},
  {"response": 503, "request": "/CP"}
]

第一个聚合组按"response""request",并在每个组中添加"response_count",看起来像这样:

[
  {"response": 200, "request": "/ST", "response_count": 1},
  {"response": 500, "request": "/ST", "response_count": 1},
  {"response": 200, "request": "/PP", "response_count": 1},
  {"response": 500, "request": "/PP", "response_count": 1},
  {"response": 200, "request": "/CP", "response_count": 2},
  {"response": 500, "request": "/CP", "response_count": 6},
  {"response": 503, "request": "/CP", "response_count": 3},
]

您的第二个聚合采用此方法,按 "request" 分组,并在每个组中添加 "response_c",如下所示:

[
  {"request": "/ST", "response_c": 2},
  {"request": "/PP", "response_c": 2},
  {"request": "/CP", "response_c": 3},
]

请注意,您未在聚合中引用的任何字段都将被删除。

然后您的规范引用了数据集中不再存在的字段,这导致了空白图表。

您可以通过在第二个聚合中指定您希望删除的字段发生什么来解决此问题;例如,您可以保留“response_count”的总和和“response”的最小值 (open in editor):

{
  "data": {
    "values": [
      {"response": 200, "request": "/ST"},
      {"response": 500, "request": "/ST"},
      {"response": 200, "request": "/PP"},
      {"response": 500, "request": "/PP"},
      {"response": 200, "request": "/CP"},
      {"response": 200, "request": "/CP"},
      {"response": 500, "request": "/CP"},
      {"response": 500, "request": "/CP"},
      {"response": 500, "request": "/CP"},
      {"response": 500, "request": "/CP"},
      {"response": 500, "request": "/CP"},
      {"response": 500, "request": "/CP"},
      {"response": 503, "request": "/CP"},
      {"response": 503, "request": "/CP"},
      {"response": 503, "request": "/CP"}
    ]
  },
  "transform": [
    {
      "aggregate": [{"op": "count", "as": "response_count"}],
      "groupby": ["response", "request"]
    },
    {
      "aggregate": [
        {"op": "count", "as": "response_c"},
        {"op": "sum", "field": "response_count", "as": "response_count"},
        {"op": "min", "field": "response", "as": "response"}
      ],
      "groupby": ["request"]
    }
  ],
  "mark": "bar",
  "encoding": {
    "x": {"field": "response_count", "type": "quantitative", "stack": "zero"},
    "y": {"field": "request", "type": "nominal"},
    "color": {"field": "response", "type": "nominal"}
  }
}

enter image description here

在这种特殊情况下,更好的做法可能是完全省略第二个聚合,在这种情况下,第二个聚合基本上是通过条形图的堆叠在视觉上发生的 (editor):

{
  "data": {
    "values": [
      {"response": 200, "request": "/ST"},
      {"response": 500, "request": "/ST"},
      {"response": 200, "request": "/PP"},
      {"response": 500, "request": "/PP"},
      {"response": 200, "request": "/CP"},
      {"response": 200, "request": "/CP"},
      {"response": 500, "request": "/CP"},
      {"response": 500, "request": "/CP"},
      {"response": 500, "request": "/CP"},
      {"response": 500, "request": "/CP"},
      {"response": 500, "request": "/CP"},
      {"response": 500, "request": "/CP"},
      {"response": 503, "request": "/CP"},
      {"response": 503, "request": "/CP"},
      {"response": 503, "request": "/CP"}
    ]
  },
  "transform": [
    {
      "aggregate": [{"op": "count", "as": "response_count"}],
      "groupby": ["response", "request"]
    }
  ],
  "mark": "bar",
  "encoding": {
    "x": {"field": "response_count", "type": "quantitative", "stack": "zero"},
    "y": {"field": "request", "type": "nominal"},
    "color": {"field": "response", "type": "nominal"}
  }
}

enter image description here

关于转换中的 Vega-lite 多重聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60929534/

相关文章:

python-3.x - 如何更改 altair 中 geo_shape 的限制(python vega-lite)

vega-lite - 内联值有什么问题?

vega-lite - 自定义 vega-lite 线图轴标签

python - 在 google colab 中更改 Altair 图表的 "save as"文件名

vega-lite:单个图表中的多个标记

interaction - 在 Vega 中拖动数据点的鼠标交互

python - 使用 Vincent/Vega 添加图表标题

javascript - Vega-Lite Wilkinson 点图,按第一位数字分组

Python:Altair:有条件地更改轴标签外观(颜色、不透明度)

vega - 在 Vega Lite 中仅显示整数值的刻度