javascript - D3.js 在径向树中添加元素之间的链接(分层边缘捆绑元素)

标签 javascript css json d3.js tree

几个月前,我尝试了 combining Hierarchical Edge Bundling and Radial Reingold–Tilford Tree using d3.js

enter image description here

我从HEB开始,试图把它做成一棵树。 事情并没有按照我想要的方式发展,我意识到从可折叠的放射状树开始(不是 Reingold Tilford)可能会更好, Angular 不同。

enter image description here

Here is a JSFiddle of the radial tree

数据模型也发生了变化,因为元素现在有了名称、子元素和导入(链接)。

var flare =
{
    "name": "root",
    "children": [
        {
            "name": "test1.parent1","children": [
                {"name": "test1.child11","children": [
                    {"name": "test1.child111"},
                    {"name": "test1.child112"}
                ]}
            ],"imports": ["test2.parent2","test3.parent3","test4.parent4"]
        },
        {
            "name": "test2.parent2","children": [
                {"name": "test2.child21"},
                {"name": "test2.child22"},
                {"name": "test2.child28","children":[
                    {"name": "test2.child281"},
                    {"name": "test2.child282"}
                ]}
            ],"imports": ["test3.parent3"]
        },
        {"name": "test3.parent3","imports": ["test4.parent4"]},
        {
            "name": "test4.parent4","children": [
                {"name": "test4.child41"},
                {"name": "test4.child42"}
            ]
        }
    ]
};

要慢慢开始,我想结合non-interactive Hierarchical edge bundling来自 Mike Bostock 与当前 JSFiddle ,但请记住,互动将在稍后成为其中的一部分。

此外,只有第一层必须有链接(父-父链接),如下所示(我想要的结果):

enter image description here

我目前最大的问题是 HEB 没有“根”,但树从单个元素开始。所以到目前为止,我所做的一切都导致树的中心一团糟。

请注意,树的中心有一个圆圈,用于覆盖根到 1 级的链接,因此树从 1 级(父级)开始。

var circle = svg.append("circle")
  .attr("cx", 0)
  .attr("cy", 0)
  .attr("r", diameter - 725.3)
  .style("fill", "#F3F5F6")
  .style("stroke-width", 0.2)
  .style("stroke", "black");

理想情况下,父级之间的链接必须在关卡折叠(未)折叠时更新,就像节点和关卡之间的链接一样,但这可以稍后进行,并且在最初获得第一级后可能并不那么困难显示的链接。此外,数据模板可能会根据需要更改,但所有 3 条信息都很重要(名称、 child 和导入)。

另一种方法是能够将数据更改为不包括根部分,并且它的行为与现在完全一样 也欢迎部分回答。

最佳答案

My current biggest issue is that the HEB has no "root", but the tree starts with a single item. So everything I have tried so far has led to a big mess at the center of the tree.

既然你有一个根,为什么不把它设置为中心“节点”并使它成为一个径向树,比如 thisHere是另一个例子,但有多个根。

也就是说,您没有要求径向树,即使这听起来可以回答您的问题。如果你决心把东西排列成不同镭的圆圈,也许要解决的问题就是那些看起来如此“凌乱”的线条纵横交错。如果是这种情况,那么不同的排序算法可能会起作用。 Here是一篇扩展了在 D3.js 的类似场景中使用不同排序算法的文章。 D3布局算法也是open source online .

我能为您找到的最佳资源是 this Stack Mathematics Answer .其中有几点对我来说特别突出:

  1. 您的连接/分支可能一团糟,但如果它是交互式的,并且当您将鼠标悬停在特定节点上时进出特定节点的分支会亮起,那么它仍然可以是一个可读/可用的图形。
  2. 您可以尝试不同的排序算法,直到找到适合您的数据的算法。
  3. 圆圈内可以有一个或多个节点,在这种情况下,将根节点放在中间可能很有意义。

这不是一个实际可用的答案,因为它在 Mathematica 中,但我认为它对基础理论和技术的解释很有用。

如果您不想将树的根放在中央,可能更艺术化的方法是使从父级到根父级的所有分支都是半透明的,并且可能是不同的颜色。

(Sorry for the low-quality photoshop)

希望这对您有所帮助!

关于javascript - D3.js 在径向树中添加元素之间的链接(分层边缘捆绑元素),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40263161/

相关文章:

javascript - 使用 chrome.storage.get 获取变量

javascript - 使用 JavaScript 使用递归函数遍历 JSON 字符串到内部级别

jquery - 在 div 上应用 CSS 'fadeInDown' 动画会停止 jQuery 'Scroll to Fade' 在同一个 div 上工作

C#:将 JSON 原语反序列化为 .NET 复杂类型

JSON Serde - 映射列名

javascript - 如何在 Angular 中创建多个单选组

javascript - fetch().then() 返回内容类型和正文

javascript - 文本框(textarea)的回车

php - 如果当前 td 有长文本,TCPDF 会忽略早期 td 的宽度

java - 链接不同文件夹中的 .css 文件时出现空指针错误