我想在一个转换中实现两个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"}}
}
有什么办法可以做到这一点?是否支持这样的多个聚合?
答案 0 :(得分:0)
是的,支持像这样的多个聚合,但是您的图表最后有未定义的字段,因为您尚未在聚合中引用它们。您将从以下数据开始:
[
{"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"}
}
}
在这种特定情况下,更好的做法是完全省略第二个聚合,在这种情况下,第二个聚合实质上是通过条形图(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"}
}
}