VEGA Sunburst 使用基于 table 的原始数据

VEGA Sunburst using table based raw data

我正在开发一个 Sunburst,它最终将在没有配置的父子结构的情况下获取输入数据,而是基于列的数据,因此我使用了嵌套转换而不是给定示例中的分层:

https://vega.github.io/editor/#/gist/c1eeb9142fd7f611513f5a4edf7e180e/spec.json

它的问题是,即使某些字段为空,只要我的数据对象获得可用于叶节点的值,它就会生成内部节点。

如何转换我的数据以获得如下示例所示的视觉效果

https://vega.github.io/editor/#/gist/112c45cfed3b9c9013ea0b63a318292f/spec.json

想法是将基于列的数据“转换”为父子结构,以便应用分层转换。

起始数据:

     {
          "value": 140,
          "level1": "France",
          "level2": "Reins",
          "level3": "Jean Monnet",
          "level4": "rue 3 ",
          "level5": "no",
          "level6": "a level"
        }

首先根据您的值或数量按所有级别或深度分组。

    "transform": [
        {
          "type": "aggregate",
          "groupby": [
            "level1",
            "level2",
            "level3",
            "level4",
            "level5",
            "level6"
          ],
          "fields": [
            "value"
          ],
          "ops": [
            "sum"
          ],
          "as": [
            "value"
          ]
        }
      ]

其次,我们需要有一个用于分层的根注释,因此根据可用数据,我们可以按如下方式转换我们的数据,以定义我们的根节点具有 level1 元素作为子节点:

     {
      "name": "isolatedLevel1",
      "source": [
        "mainData"
      ],
      "transform": [
        {
          "type": "project",
          "fields": [
            "level1",
            "currentNode",
            "value"
          ],
          "as": [
            "currentNode",
            "parent",
            "value"
          ]
        },
        {
          "type": "aggregate",
          "groupby": [
            "parent",
            "currentNode"
          ],
          "fields": [
            "value"
          ],
          "ops": [
            "sum"
          ],
          "as": [
            "value"
          ]
        },
        {
          "type": "formula",
          "as": "parent",
          "expr": "!isDefined(datum.parent)?'rootID':datum.parent"
        },
        {
          "type": "project",
          "fields": [
            "currentNode",
            "parent",
            "value"
          ],
          "as": [
            "currentNode",
            "parent",
            "value"
          ]
        },
        {
          "type": "filter",
          "expr": "datum.currentNode"
        }
      ]
    },
    {
      "name": "rootNode",
      "source": "isolatedLevel1",
      "transform": [
        {
          "type": "project",
          "fields": [
            "parent",
            "level2"
            
          ],
          "as": [
            "currentNode",
            "parent"
          ]
        },
        {
  "type": "aggregate",
  "groupby": ["currentNode","parent"]
},
{
          "type": "project",
          "fields": [
            "currentNode",
            "parent"
            
          ],
          "as": [
            "currentNode",
            "parent"
          ]
        }
      ]
    },

    {
      "name": "isolatedLevel1MergedWithParent",
      "source": [
        "isolatedLevel1",
        "rootNode"
      ]
    },

然后,想法是为即将到来的级别确定 2 个级别之间的父级和子级。 我们可以应用此数据转换并重复它直到数据的最后一级。

 {
  "name": "isolatedLevel2",
  "source": "mainData",
  "transform": [
    {
      "type": "project",
      "fields": [
        "level1",
        "level2",
        "value"
      ],
      "as": [
        "parent",
        "currentNode",
        "value"
      ]
    },
    {
      "type": "aggregate",
      "groupby": [
        "parent",
        "currentNode"
      ],
      "fields": [
        "value"
      ],
      "ops": [
        "sum"
      ],
      "as": [
        "value"
      ]
    },
    {
      "type": "project",
      "fields": [
        "currentNode",
        "parent",
        "value"
      ],
      "as": [
        "currentNode",
        "parent",
        "value"
      ]
    },
    {
      "type": "filter",
      "expr": "datum.currentNode"
    },
    {
      "type": "filter",
      "expr": "datum.parent"
    }
  ]
}

最后,我们将所有这些“分解”转换合并在一起以取回我们的数据,转换为父子层次结构,其值仅与其节点关联。这是一种使您的数据适合 Stratify VEGA 转换的方法。

{
  "name": "mergedlevelsFinal",
  "source": [
    "isolatedLevel1",
    "isolatedLevel2",
    "isolatedLevel3",
    "isolatedLevel4",
    "isolatedLevel5",
    "isolatedLevel6",
    "rootNode"
  ],
  "transform": [
    {
      "type": "formula",
      "as": "value",
      "expr": "!indata('parents','parent',datum.currentNode)? datum.value:''"
    }
  ]
}

困难的部分已经过去,我们现在可以根据我们想要的旭日形应用我们的分层到转换后的数据。

  {
  "name": "tree",
  "source": [
    "mergedlevelsFinal"
  ],
  "transform": [
    {
      "type": "stratify",
      "key": "currentNode",
      "parentKey": "parent"
    },
    {
      "type": "partition",
      "field": "value",
      "sort": {
        "field": "value"
      },
      "size": [
        {
          "signal": "2 * PI"
        },
        {
          "signal": "width / 3"
        }
      ],
      "as": [
        "a0",
        "r0",
        "a1",
        "r1",
        "depth",
        "children"
      ]
    },
    {
      "type": "formula",
      "expr": "!datum.children?datum.value:''",
      "as": "value"
    }
  ]
}


    

此处提供完整规格解决方案 https://vega.github.io/editor/#/gist/0f66d06894b61f8ba131f13f564e8c1f/spec.json