Hi,
I have a working 3 Node Sankey Diagramm but the lines go anywehre and not where they should go.
{
"$schema": "https://vega.github.io/schema/vega/v3.0.json",
"data": [
{
"name": "rawData",
"url": {
"%context%": true,
"%timefield%": "@timestamp",
"index": "filebeat-*",
"body": {
"size": 0,
"aggs": {
"table": {
"composite": {
"size": 10000,
"sources": [
{"stk1": {"terms": {"field": "source.ip"}}},
{"stk2": {"terms": {"field": "observer.ip"}}},
{"stk3": {"terms": {"field": "destination.ip"}}}
]
},
"aggs": {
"bytes": {
"sum": {"field": "network.bytes"}
}
}
}
}
}
},
"format": {"property": "aggregations.table.buckets"},
"transform": [
{"type": "formula", "expr": "datum.key.stk1", "as": "stk1"},
{"type": "formula", "expr": "datum.key.stk2", "as": "stk2"},
{"type": "formula", "expr": "datum.key.stk3", "as": "stk3"},
{"type": "formula", "expr": "datum.bytes.value", "as": "size"}
]
}
{
"name": "nodes",
"source": "rawData",
"transform": [
{"type": "filter", "expr": "!groupSelector || groupSelector.stk1 == datum.stk1 || groupSelector.stk2 == datum.stk2 || groupSelector.stk3 == datum.stk3"},
{"type": "formula", "expr": "datum.stk1+datum.stk2+datum.stk3", "as": "key"},
{"type": "fold", "fields": ["stk1", "stk2", "stk3"], "as": ["stack", "grpId"]},
{"type": "formula", "expr": "datum.stack == 'stk1' ? datum.stk1+datum.stk2+datum.stk3 : datum.stk3+datum.stk2+datum.stk1", "as": "sortField"},
{"type": "stack", "groupby": ["stack"], "sort": {"field": "sortField", "order": "descending"}, "field": "size"},
{"type": "formula", "expr": "(datum.y0+datum.y1)/2", "as": "yc"}
]
},
{
"name": "groups",
"source": "nodes",
"transform": [
{"type": "aggregate", "groupby": ["stack", "grpId"], "fields": ["size"], "ops": ["sum"], "as": ["total"]},
{"type": "stack", "groupby": ["stack"], "sort": {"field": "grpId", "order": "descending"}, "field": "total"},
{"type": "formula", "expr": "scale('y', datum.y0)", "as": "scaledY0"},
{"type": "formula", "expr": "scale('y', datum.y1)", "as": "scaledY1"},
{"type": "formula", "expr": "scale('y', datum.y2)", "as": "scaledY2"},
{"type": "formula", "expr": "datum.stack == 'stk1'", "as": "rightLabel"},
{"type": "formula", "expr": "datum.total/domain('y')[1]", "as": "percentage"}
]
},
{"name": "midNodes", "source": "nodes", "transform": [{"type": "filter", "expr": "datum.stack == 'stk2'"}]},
{"name": "rightNodes", "source": "nodes", "transform": [{"type": "filter", "expr": "datum.stack == 'stk3'"}]},
{
"name": "leftnode",
"source": "nodes",
"transform": [
{"type": "filter", "expr": "datum.stack == 'stk1'"},
{"type": "lookup", "from": "midNodes", "key": "key", "fields": ["key"], "as": ["target"]},
{
"type": "linkpath",
"orient": "horizontal",
"shape": "diagonal",
"sourceY": {"expr": "scale('y', datum.yc)"},
"sourceX": {"expr": "scale('x', 'stk1') + bandwidth('x')"},
"targetY": {"expr": "scale('y', datum.target.yc)"},
"targetX": {"expr": "scale('x', 'stk2')"}
},
{"type": "formula", "expr": "range('y')[0]-scale('y', datum.size)", "as": "strokeWidth"},
{"type": "formula", "expr": "datum.size/domain('y')[1]", "as": "percentage"}
]
}
{
"type": "linkpath",
"name": "midnode",
"source": "nodes",
"transform": [
{"type": "filter", "expr": "datum.stack == 'stk2'"},
{"type": "lookup", "from": "rightNodes", "key": "key", "fields": ["key"], "as": ["target"]},
{
"type": "linkpath",
"orient": "horizontal",
"shape": "diagonal",
"sourceY": {"expr": "scale('y', datum.yc)"},
"sourceX": {"expr": "scale('x', 'stk2') + bandwidth('x')"},
"targetY": {"expr": "scale('y', datum.target.yc)"},
"targetX": {"expr": "scale('x', 'stk3')"}
},
{"type": "formula", "expr": "range('y')[0]-scale('y', datum.size)", "as": "strokeWidth"},
{"type": "formula", "expr": "datum.size/domain('y')[1]", "as": "percentage"}
]
}
],
"scales": [
{"name": "x", "type": "band", "range": "width", "domain": ["stk1", "stk2", "stk3"], "paddingOuter": 0.01, "paddingInner": 0.98},
{"name": "y", "type": "linear", "range": "height", "domain": {"data": "nodes", "field": "y1"}},
{"name": "color", "type": "ordinal", "range": "category", "domain": {"data": "rawData", "fields": ["stk1", "stk2", "stk3"]}},
{"name": "stackNames", "type": "ordinal", "range": ["Source", "Observer", "Destination"], "domain": ["stk1", "stk2", "stk3"]}
],
"axes": [
{
"orient": "bottom",
"scale": "x",
"labelColor": {
"value": "#000000"
},
"domainColor": {"value": "#000000"},
"tickColor": {"value": "#000000"},
"encode": {
"labels": {
"update": {
"text": {"scale": "stackNames", "field": "value"},
"fontSize": {"value": 14}
}
}
}
},
{
"orient": "left",
"scale": "y",
"labelColor": {
"value": "#000000"
},
"domainColor": {"value": "#000000"},
"tickColor": {"value": "#000000"},
"encode": {
"labels": {
"update": {
"text": {"signal": "format(datum.value, '.2s') + 'B'"},
"fontSize": {"value": 12}
}
}
}
}
],
"marks": [
{
"type": "path",
"name": "leftMark",
"from": {"data": "leftnode"},
"clip": true,
"encode": {
"update": {
"stroke": [{"test": "groupSelector && groupSelector.stack=='stk1'", "scale": "color", "field": "stk2"}, {"scale": "color", "field": "stk1"}],
"strokeWidth": {"field": "strokeWidth"},
"path": {"field": "path"},
"strokeOpacity": {"signal": "!groupSelector && (groupHover.stk1 == datum.stk1 || groupHover.stk2 == datum.stk2) ? 0.75 : 0.3"},
"zindex": {"signal": "!groupSelector && (groupHover.stk1 == datum.stk1 || groupHover.stk2 == datum.stk2) ? 1 : 0"},
"tooltip": {"signal": "datum.stk1 + ' → ' + datum.stk2 + ' ' + format(datum.size, ',.0f') + ' (' + format(datum.percentage, '.1%') + ')'"}
},
"hover": {"strokeOpacity": {"value": 0.75}}
}
},
{
"type": "path",
"name": "rightMark",
"from": {"data": "midnode"},
"clip": true,
"encode": {
"update": {
"stroke": [{"test": "groupSelector && groupSelector.stack=='stk1'", "scale": "color", "field": "stk2"}, {"scale": "color", "field": "stk1"}],
"strokeWidth": {"field": "strokeWidth"},
"path": {"field": "path"},
"strokeOpacity": {"signal": "!groupSelector && (groupHover.stk1 == datum.stk1 || groupHover.stk2 == datum.stk2) ? 0.75 : 0.3"},
"zindex": {"signal": "!groupSelector && (groupHover.stk1 == datum.stk1 || groupHover.stk2 == datum.stk2) ? 1 : 0"},
"tooltip": {"signal": "datum.stk1 + ' → ' + datum.stk2 + ' ' + format(datum.size, ',.0f') + ' (' + format(datum.percentage, '.1%') + ')'"}
},
"hover": {"strokeOpacity": {"value": 0.75}}
}
},
{
"type": "rect",
"name": "groupMark",
"from": {"data": "groups"},
"encode": {
"enter": {"fill": {"scale": "color", "field": "grpId"}, "width": {"scale": "x", "band": 1}},
"update": {
"x": {"scale": "x", "field": "stack"},
"y": {"field": "scaledY0"},
"y2": {"field": "scaledY1"},
"fillOpacity": {"value": 1},
"tooltip": {"signal": "datum.grpId + ': ' + format(datum.total, ',.0f') + ' (' + format(datum.percentage, '.1%') + ')'"}
},
"hover": {"fillOpacity": {"value": 1}}
}
},
{
"type": "text",
"from": {"data": "groups"},
"interactive": false,
"encode": {
"update": {
"x": {"signal": "scale('x', datum.stack) + (datum.rightLabel ? bandwidth('x') + 8 : -8)"},
"yc": {"signal": "(datum.scaledY0 + datum.scaledY1)/2"},
"align": {"signal": "datum.rightLabel ? 'left' : 'right'"},
"baseline": {"value": "middle"},
"fontWeight": {"value": "bold"},
"fontSize": {"value": 12},
"text": {"signal": "abs(datum.scaledY0-datum.scaledY1) > 11 ? datum.grpId : ''"}
}
}
},
{
"type": "group",
"data": [{"name": "dataForShowAll", "values": [{}], "transform": [{"type": "filter", "expr": "groupSelector"}]}],
"encode": {"enter": {"xc": {"signal": "width/1.85"}, "y": {"value": 0}, "width": {"value": 65}, "height": {"value": 25}}},
"marks": [
{
"type": "group",
"name": "groupReset",
"from": {"data": "dataForShowAll"},
"encode": {
"enter": {"cornerRadius": {"value": 3.5}, "fill": {"value": "#666666"}, "height": {"field": {"group": "height"}}, "width": {"field": {"group": "width"}}},
"update": {"opacity": {"value": 1}},
"hover": {"fill": {"value": "#444444"}}
},
"marks": [
{
"type": "text",
"interactive": false,
"encode": {
"enter": {
"xc": {"field": {"group": "width"}, "mult": 0.5},
"yc": {"field": {"group": "height"}, "mult": 0.5, "offset": 1},
"align": {"value": "center"},
"baseline": {"value": "middle"},
"text": {"value": "Show All"},
"fontSize": {"value": 14},
"stroke": {"value": "#ecf0f1"}
}
}
}
]
}
]
}
],
"signals": [
{
"name": "groupHover",
"value": {},
"on": [
{"events": "@groupMark:mouseover", "update": "{stk1:datum.stack=='stk1' && datum.grpId, stk2:datum.stack=='stk2' && datum.grpId, stk3:datum.stack=='stk3' && datum.grpId}"},
{"events": "mouseout", "update": "{}"}
]
},
{
"name": "groupSelector",
"value": false,
"on": [
{"events": "@groupMark:click!", "update": "{stack:datum.stack, stk1:datum.stack=='stk1' && datum.grpId, stk2:datum.stack=='stk2' && datum.grpId, stk3:datum.stack=='stk3' && datum.grpId}"},
{"events": [{"type": "click", "markname": "groupReset"}, {"type": "dblclick"}], "update": "false"}
]
}
]
}
can anyone help me?
Thanks in advance