在 javascript/d3 中读取 DOT 文件

问题描述 投票:0回答:4

是否有一种标准方法可以在 javascript 中读取和解析 DOT 图形文件,最好是在 d3 中很好地工作?

目前,我唯一能想到的就是阅读纯文本并进行自己的解析。希望这会重新发明轮子。

d3.text("graph.dot", function(error, dotGraph) {
    ....
)};
d3.js dot
4个回答
43
投票

⚠ 此处提出的解决方案取决于两个被作者标记为不支持的库。

要获取用 Javascript 渲染的 Graphviz DOT 文件,请结合使用 graphlib-dotdagre-d3 库。

graphlibDot.read()
方法采用 DOT 语法中的图或有向图定义并生成图对象。 然后
dagreD3.render()
方法可以将此图形对象输出到 SVG。

然后,您可以使用其他 D3 方法向图形添加功能,根据需要从 graphlib 图形对象中检索其他节点和边属性。

一个简单的独立示例是:

window.onload = function() {
  // Parse the DOT syntax into a graphlib object.
  var g = graphlibDot.read(
    'digraph {\n' +
    '    a -> b;\n' +
    '    }'
  )

  // Render the graphlib object using d3.
  var render = new dagreD3.render();
  render(d3.select("svg g"), g);


  // Optional - resize the SVG element based on the contents.
  var svg = document.querySelector('#graphContainer');
  var bbox = svg.getBBox();
  svg.style.width = bbox.width + 40.0 + "px";
  svg.style.height = bbox.height + 40.0 + "px";
}
svg {
  overflow: hidden;
}
.node rect {
  stroke: #333;
  stroke-width: 1.5px;
  fill: #fff;
}
.edgeLabel rect {
  fill: #fff;
}
.edgePath {
  stroke: #333;
  stroke-width: 1.5px;
  fill: none;
}
<script src="https://d3js.org/d3.v5.min.js"></script>
<script src="https://dagrejs.github.io/project/graphlib-dot/v0.6.4/graphlib-dot.min.js"></script>
<script src="https://dagrejs.github.io/project/dagre-d3/v0.5.0/dagre-d3.min.js"></script>

<html>

<body>
  <script type='text/javascript'>
  </script>
  <svg id="graphContainer">
    <g/>
  </svg>
</body>

</html>


11
投票

聚会迟到了,但如果您仍然感兴趣,可以使用我刚刚发布的新 d3-graphviz 插件来实现此目的:

<!DOCTYPE html>
<meta charset="utf-8">
<body>
<script src="https://d3js.org/d3.v7.js"></script>
<script src="https://unpkg.com/@hpcc-js/[email protected]/dist/graphviz.umd.js"></script>
<script src="https://unpkg.com/d3-graphviz@5/build/d3-graphviz.js"></script>
<div id="graph" style="text-align: center;"></div>
<script>

d3.select("#graph").graphviz()
    .renderDot('digraph  {a -> b}');

</script>

编辑 2024-07-27: 将示例更新到最新的 d3-graphviz 版本并仅使用 https。


4
投票

相同的示例,使用最新版本的 graphlib-dot 和 dagre-d3。

window.onload = function() {
      // Parse the DOT syntax into a graphlib object.
      var g = graphlibDot.read(
        'digraph {\n' +
        '    a -> b;\n' +
        '    }'
      )

      // Render the graphlib object using d3.
      var renderer = dagreD3.render();
      d3.select("svg g").call(renderer, g);


      // Optional - resize the SVG element based on the contents.
      var svg = document.querySelector('#graphContainer');
      var bbox = svg.getBBox();
      svg.style.width = bbox.width + 40.0 + "px";
      svg.style.height = bbox.height + 40.0 + "px";
    }
svg {
  overflow: hidden;
}
.node rect {
  stroke: #333;
  stroke-width: 1.5px;
  fill: #fff;
}
.edgeLabel rect {
  fill: #fff;
}
.edgePath {
  stroke: #333;
  stroke-width: 1.5px;
  fill: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<script src="http://cpettitt.github.io/project/graphlib-dot/latest/graphlib-dot.min.js"></script>
<script src="http://cpettitt.github.io/project/dagre-d3/latest/dagre-d3.js"></script>

    <html>

    <body>
      <script type='text/javascript'>
      </script>
      <svg id="graphContainer">
        <g/>
      </svg>
    </body>

    </html>


4
投票

问题要求能够在

.dot
javascript
中可视化
D3js
文件。我认为评分最高的答案中的解决方案适合你们大多数人。

我不开心是因为这3个原因:

  1. 除了
    lowdash
    之外,它还涉及
    dagre
    graphlib
    D3js
    等库,并且是重量级的。
  2. 解析器输出不是
    D3js
    “简单”的数据结构。
  3. 非 D3js 风格的使用(API)。

这就是为什么我创建了一个适配器,它基本上允许您通过更改一个语句来将

.dot
文件与数千个
D3js
样本中的任何一个一起使用。如果您有一些
D3js
可视化处理以下数据结构:

{
  "nodes": [ {"id": "Myriel"}, {"id": "Napoleon"}],
  "links": [ {"source": "Myriel"}, {"target": "Napoleon"}]
} 

只需包含以下脚本并调用

d3.dot
:

<script src="https://cdn.jsdelivr.net/gh/gmamaladze/[email protected]/build/d3-dot-graph.min.js"></script>
<script>

d3.dot(url, function(graph) {
   ...
});

</script>

而不是:

d3.json(url, function(graph) {...});

包含代码和示例的 GitHub 存储库

© www.soinside.com 2019 - 2024. All rights reserved.