在 d3.js 中将节点和链接转换为分层树

Posted

技术标签:

【中文标题】在 d3.js 中将节点和链接转换为分层树【英文标题】:Converting nodes and links to hierarchical tree in d3.js 【发布时间】:2012-12-03 22:34:23 【问题描述】:

我有一个 JSON 表示一个图形(在我的例子中也是一个树),看起来像这样:

"directed": true, "graph": [], 
"nodes": ["time": 4, "id": 4551308, "name": "Alto da Boa Vista", "time": 7, "id": 4551309, "name": "Sumare",
...
"links": ["source": 0, "target": 36, "weight": 1, 
"source": 1, "target": 36, "weight": 1,
...

为了使用它来构建像本例中的树 http://mbostock.github.com/d3/talk/20111116/force-collapsible.html,我需要将此 JSON 转换为分层对象,其中子节点嵌套在父节点中,如下所示:https://github.com/mbostock/d3/wiki/Tree-Layout#wiki-tree。

D3 是否有一些内置函数可以将图形转换为树? 或者您将如何从图形生成嵌套树 JSON 对象?

我在这个 jsFiddle 中有示例:http://jsfiddle.net/fccoelho/bFT8K/8/

【问题讨论】:

您能找到解决方案吗?我希望将我已经准备好的 nodeslinks json 数组转换为分层格式的 json,而无需重新编写完整的 json 生成代码。 【参考方案1】:

好的,这是一个两部分的答案。

第 1 部分: D3 确实具有将数组转换为嵌套结构的内置功能。看看 d3.nest() 函数

API 文档:https://github.com/d3/d3/blob/master/API.md#nests

这主要用于分层布局:Cluster、Pack、Partition、Treemap

第 2 部分: 如果您尝试实现类似于您发布的示例的布局,那么您不需要对您的数据做任何事情。该示例使用需要图形的强制布局。由于力布局可以处理任何形状的图形,而树只是一个遵循一些约束的图形,因此您不需要进行任何转换。如果图表的形状恰好是一棵树,那么它看起来就像一棵树。

这应该足够好了:

force
  .nodes(spread.nodes)
  .links(spread.links)
  .start();

【讨论】:

使用强制我可以获得 x,y 位置,但它看起来不像树,因为所有节点都是随机出现的,我需要将它们设置为树或某种排列方式 请将文档链接更新为github.com/d3/d3/blob/master/API.md#nests

以上是关于在 d3.js 中将节点和链接转换为分层树的主要内容,如果未能解决你的问题,请参考以下文章

从 MySQL 结果和 PHP 为 D3.js 树创建分层 JSON?

如何在 d3.js 中同时自动移动节点和链接

D3.js的V5版本-Vue框架中使用-树状图

将 ctree 输出转换为 JSON 格式(用于 D3 树布局)

在节点中将 svg 图像从 url 转换为 base64

在节点中将 svg 图像从 url 转换为 base64