【问题标题】:Directed acyclic graph using d3.js without DOT使用没有 DOT 的 d3.js 的有向无环图
【发布时间】:2026-02-15 09:00:01
【问题描述】:

我正在尝试使用 d3.js 绘制有向无环图。在搜索布局时,我遇到了Dagre,但它似乎用处不大,因为我不想在任何地方使用基于 DOT 的代码。如果有人知道纯 Javascript 解决方案或 DAG 的插件/自定义布局,请告诉我。提前致谢。

【问题讨论】:

    标签: javascript d3.js graph directed-acyclic-graphs dagre-d3


    【解决方案1】:

    Dagre 作者在这里。 Dagre 不包含任何 graphviz 代码——它是纯 JavaScript。它基于类似的布局技术;两者都基于 Sugiyama 论文中的技术。

    你可以在这里找到一些 dagre 的例子:

    http://cpettitt.github.io/project/dagre-d3/latest/demo/interactive-demo.html http://cpettitt.github.io/project/dagre-d3/latest/demo/sentence-tokenization.html http://cpettitt.github.io/project/dagre-d3/latest/demo/tcp-state-diagram.html

    可以在此处找到缩小的源:http://cpettitt.github.io/project/dagre-d3/latest/dagre-d3.min.js。它的时钟频率约为 44K。

    【讨论】:

    • 谢谢克里斯。我现在详细研究了dagre,但仍然不清楚几个方面:1.它可以处理图形中的循环,但不是一个很大的限制? 2. 我可以在图表布局中使用图标而不是基本形状吗?
    • 1) 可以处理带循环的图。 2) 它对矩形以外的形状没有特殊处理。但是,您可以覆盖绘制节点形状的函数 (renderer.drawNode(yourDrawNode))。您可以在此处查看其工作原理的示例:cpettitt.github.io/project/dagre-d3/latest/demo/…。或者,您可以通过以 HTML 元素开始标签来使用 HTML。请参阅此示例中节点 A 的标签:cpettitt.github.io/project/dagre-d3/latest/demo/…
    • 谢谢克里斯。真的很有帮助。
    • Dagre 似乎不再受支持,使用 d3v3。 dagre 有什么好的替代品吗?
    • 起初,Dagre-d3 看起来很有希望。但是,它在 IE 上被破坏了。此外,它似乎通过不使用正确的 d3 编码实践来掩埋 d3 的力量。例如,您可以通过显式指定 html 标志来制作 html 标签而不是文本标签。正确的 d3 实现将允许您的节点成为您使用进入/更新/退出概念完全控制的 svg 标签。
    【解决方案2】:

    渲染有向无环图(并实际上突出显示有向性属性)是Sugiyama 布局算法的一个领域。

    他们基本上将层(通过拓扑排序)分配给节点,然后计算层中节点的排序。首先使用简单的启发式来反转循环,这也适用于循环图。 Graphviz DOT 有一个名为dot 的布局实现,这也是它使用的文件格式的名称,所以在提到 DOT 时有时会有点混乱。

    当然还有其他算法的实现,即使是交叉编译的 Javascript 版本的 dot 也是available。可用于 Javascript 的功能最完整的解决方案可能是 yFiles 库中算法的商业实现。因此,如果这是在商业场景中,您可能需要查看相应的live demo。请注意,虽然 yFiles 带有自己的渲染和编辑器实现,但您仍然可以将代码插入 d3.js,因为布局算法可以用作独立实现来“仅”计算节点的坐标,边缘连接点,弯头和标签。此特定实现支持大量附加约束,例如“端口约束”(限制传出和传入边的方向以及它们在节点上的确切位置)、分层分组节点(每个节点可以有一个父节点并且父节点“包含”它的所有子节点)、层和序列约束、边缘标记约束、不同的边缘路由样式、总线路由等等。

    披露:我为创建上述库的公司工作,但是我不代表我的雇主。

    【讨论】:

    • 谢谢。基本上,我不愿使用 graphViz,因为它需要为每个操作系统进行编译,但我会看看 yFiles。
    • @AmitGupta:GraphViz 的 Javascript 交叉编译版本当然不需要“重新编译”。然而,它在浏览器中仍然感觉像是一个巨大的二进制 blob - 它没有真正的 API,但它更像是一个控制台应用程序,即使在浏览器中也是如此。
    • 是的。我同意。似乎需要自定义布局。
    • 我尝试了 dagre、mxgraph、yFiles、Cytoscape 和许多其他工具。最完整的实现是 yFiles Hierarchical Layout Style 实现的 definitley。我很想将此布局与 d3.js 或 cytoscape 一起使用,但我找不到任何关于它的信息。你能帮忙吗?
    • @SimonS。即使没有查看器实现,也可以使用 yFiles 库。算法可以“无头”运行,所有相关属性都可以通过 API 读取并应用于 d3 图。另一种选择是使用 yFiles 查看器实现并使用 d3js 节点渲染。联系支持团队了解更多详情!
    最近更新 更多