如何使用Vega / Vega-lite渲染类/组织/流程/状态图/图表

布莱恩·亨特

我找不到Vega的状态/类/流程图/组织结构图示例。那里有东西吗?

感觉Vega非常适合此操作(如果有些过分了),但是没有示例可以从此开始,这是一个相当陡峭的学习曲线。“ Vega的工作原理页面上有一些示例,但没有指向其构建方式的链接:

维加如何工作图表

还有一个树布局示例,但是尚不清楚如何将其转换为适合流程图样式图的块。

在此处输入图片说明

Here's some examples of the sort of output desired (plus other shapes e.g. diamonds/triangles) from e.g. mermaid.js

类图

timur

Suppose you're able to represent your chart as follows:

"values": [
        {"id": "1", "parent": null, "title": "Animal"},
        {"id": "2", "parent": "1", "title": "Duck"},
        {"id": "3", "parent": "1", "title": "Fish"},
        {"id": "4", "parent": "1", "title": "Zebra"}
      ]

What you can then do is to lay the nodes out in a tree-like shape (stratify does the job):

"transform": [
        {
          "type": "stratify",
          "key": "id",
          "parentKey": "parent"
        },
        {
          "type": "tree",
          "method": "tidy",
          "separation": true,
          "size": [{"signal": "width"}, {"signal": "height"}]
        }
      ]

having laid out the nodes, you need to generate connecting lines, treelinks + linkpath combo does exactly that:

{
      "name": "links",
      "source": "tree", // take datasource "tree" as input
      "transform": [
        { "type": "treelinks" }, // apply transform 1
        { "type": "linkpath", // follow up with next transform
          "shape": "diagonal"
          }
      ]
    }

now that you've got your data sources, you want to draw actual objects. in Vega these are called marks. I guess this is where I'm going to deviate from your desired output as I'm only drawing one rectangle with a title for each data point and some basic lines to connect:

"marks": [
    {
      "type": "path",
      "from": {"data": "links"}, // dataset we defined above
      "encode": {
        "enter": {
          "path": {"field": "path"} // linkpath generated a dataset with "path" field in it - we just grab it here
        }
      }
    },
    {
      "type": "rect",
      "from": {"data": "tree"},
      "encode": {
        "enter": {
          "stroke": {"value": "black"},
          "width": {"value": 100},
          "height": {"value": 20},
          "x": {"field": "x"},
          "y": {"field": "y"}
        }
      }
    },
    {
      "type": "text",
      "from": {"data": "tree"}, // use data set we defined earlier
      "encode": {
        "enter": {
          "stroke": {"value": "black"},
          "text": {"field": "title"}, // we can use data fields to display actual values
          "x": {"field": "x"}, // use data fields to draw values from
          "y": {"field": "y"},
          "dx": {"value":50}, // offset the mark to appear in rectangle center
          "dy": {"value":13},
          "align": {"value": "center"}
        }
      }
    }
  ]

总而言之,我得出的目标状态非常基本这绝对不是精确的匹配:那里的矩形可能应该替换为groups,连接路径也需要一些工作。您会注意到,我并没有使用它signals来提供动态的用户输入和update/ exit/hover指令-再次为简单起见。

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "width": 800,
  "height": 300,
  "padding": 5,

  "data": [
    {
      "name": "tree",
      "values": [
        {"id": "1", "parent": null, "title": "Animal"},
        {"id": "2", "parent": "1", "title": "Duck"},
        {"id": "3", "parent": "1", "title": "Fish"},
        {"id": "4", "parent": "1", "title": "Zebra"}
      ],
      "transform": [
        {
          "type": "stratify",
          "key": "id",
          "parentKey": "parent"
        },
        {
          "type": "tree",
          "method": "tidy",
          "separation": true,
          "size": [{"signal": "width"}, {"signal": "height"}]
        }
      ]      
    },
    {
      "name": "links",
      "source": "tree",
      "transform": [
        { "type": "treelinks" },
        { "type": "linkpath",
          "shape": "diagonal"
          }
      ]
    }, 
    {
      "name": "tree-boxes",
      "source": "tree",
      "transform": [
          { 
            "type": "filter",
            "expr": "datum.parent == null"
          }
        ]
    },
    {
      "name": "tree-circles",
      "source": "tree",
      "transform": [
        {
          "type": "filter",
          "expr": "datum.parent != null"
        }
      ]
    }
  ],
  "marks": [
    {
      "type": "path",
      "from": {"data": "links"},
      "encode": {
        "enter": {
          "path": {"field": "path"}
        }
      }
    },
    {
      "type": "rect",
      "from": {"data": "tree-boxes"},
      "encode": {
        "enter": {
          "stroke": {"value": "black"},
          "width": {"value": 100},
          "height": {"value": 20},
          "x": {"field": "x"},
          "y": {"field": "y"}
        }
      }
    },
    {
      "type": "symbol",
      "from": {"data": "tree-circles"},
      "encode": {
        "enter": {
          "stroke": {"value": "black"},
          "width": {"value": 100},
          "height": {"value": 20},
          "x": {"field": "x"},
          "y": {"field": "y"}
        }
      }
    },
    {
      "type": "rect",
      "from": {"data": "tree"},
      "encode": {
        "enter": {
          "stroke": {"value": "black"},
          "width": {"value": 100},
          "height": {"value": 20},
          "x": {"field": "x"},
          "y": {"field": "y"}
        }
      }
    },
    {
      "type": "text",
      "from": {"data": "tree"},
      "encode": {
        "enter": {
          "stroke": {"value": "black"},
          "text": {"field": "title"},
          "x": {"field": "x"},
          "y": {"field": "y"},
          "dx": {"value":50},
          "dy": {"value":13},
          "align": {"value": "center"}
        }
      }
    }
  ]
}

UPD:假设您想为图表的根节点和叶节点渲染不同的形状。一种实现方法是filter根据您的tree数据集添加两个转换并相应地过滤它们:

    {
      "name": "tree-boxes",
      "source": "tree", // grab the existing data
      "transform": [
          { 
            "type": "filter",
            "expr": "datum.parent == null" // run it through a filter defined by expression
          }
        ]
    },
    {
      "name": "tree-circles",
      "source": "tree",
      "transform": [
        {
          "type": "filter",
          "expr": "datum.parent != null"
        }
      ]
    }

然后不要渲染所有标记,rect而是要为各个转换后的数据集提供两种不同的形状:

{
      "type": "rect",
      "from": {"data": "tree-boxes"},
      "encode": {
        "enter": {
          "stroke": {"value": "black"},
          "width": {"value": 100},
          "height": {"value": 20},
          "x": {"field": "x"},
          "y": {"field": "y"}
        }
      }
    },
    {
      "type": "symbol",
      "from": {"data": "tree-circles"},
      "encode": {
        "enter": {
          "stroke": {"value": "black"},
          "width": {"value": 100},
          "height": {"value": 20},
          "x": {"field": "x"},
          "y": {"field": "y"}
        }
      }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Vega创建Cladogram图?

来自分类Dev

如何使用Vega-lite过滤字符串前缀

来自分类Dev

如何使用 Vega-Lite 在轴上绘制多个变量?

来自分类Dev

Vega Lite计算问题

来自分类Dev

vega-lite:如何按周汇总

来自分类Dev

Vega-Lite-如何绘制箭头?

来自分类Dev

如何创建圆角条形图 vega

来自分类Dev

在Vega / Vega-lite中绘制漏斗图

来自分类Dev

在Vega-Lite中使用图例过滤简明图表

来自分类Dev

如何仅在水平轴上使用vega-lite链接多个图?

来自分类Dev

vega-lite:如何动态调整单个图的大小

来自分类Dev

使用vega-lite为烛台图着色

来自分类Dev

缩放,跟踪Vega-Lite重复图表

来自分类Dev

vega-lite:可调选择?

来自分类Dev

在还使用颜色编码时,如何在vega-lite中使用zero = false?

来自分类Dev

在使用express.js时如何使用Vega在后端生成图

来自分类Dev

Vega-Lite:如何在变换计算中使用滑块值

来自分类Dev

如何使用名称中带有空格的字段进行Vega-Lite计算?

来自分类Dev

如何在vega-lite中过滤数据?

来自分类Dev

如何在Vega-Lite中建立预先计算的直方图?

来自分类Dev

Vega-Lite / Altair:如何居中或裁剪欧洲地图?

来自分类Dev

如何在vega-lite中过滤数据?

来自分类Dev

如何在Vega Lite中重命名图例标签?

来自分类Dev

如何在Vega LIte中创建相对标记位置

来自分类Dev

如何在Vega中使用`rule`标记

来自分类Dev

如何在PyQt小部件中渲染Altair / Vega

来自分类Dev

在Vega Lite中设置默认字体

来自分类Dev

Vega lite选择N个对象(数量)

来自分类Dev

在Vega-lite中转换数据