我们想使用 d3 绘制一个网络路由图,它具有固定的开始和结束节点,但它们之间的不同路径可能共享一些节点,例如:
我在 d3.js 中阅读了 Configure fixed-layout static graph 的评论,并成功创建了一个简单的图形,例如:
但是当我向图中添加更多节点时,它变得随机(刷新后不是静态的)并且不再是正交的:
所以我的问题是:
- 是否可以使用 d3.js 绘制接近所需图形的东西?
- 或者是否有我应该在我的图形实现中使用的算法?
我们想使用 d3 绘制一个网络路由图,它具有固定的开始和结束节点,但它们之间的不同路径可能共享一些节点,例如:
我在 d3.js 中阅读了 Configure fixed-layout static graph 的评论,并成功创建了一个简单的图形,例如:
但是当我向图中添加更多节点时,它变得随机(刷新后不是静态的)并且不再是正交的:
所以我的问题是:
在这里查看我的演示。</p>
http://jsfiddle.net/doraeimo/JEcdS/
主要思想是基于树进行连接。
//1)temporarily convert a connectivity to a tree
var tree = conv2tree(data);
//2)calculate for nodes' coords with <code>cluster.nodes(tree);</code>
var nodes = buildNodes(tree);
//3)append all the edges(links) of the connectivity
var links = buildLinks(data);
我使用 Dagre-d3 构建了一个示例,它将 Dagre(@frank 建议)与 D3 集成在一起。
// Display options
var options = {
rankdir: "LR"
};
// Create the input graph
var g = new dagreD3.graphlib.Graph()
.setGraph(options)
.setDefaultEdgeLabel(function() {
return {};
});
// Set nodes
var n_nodes = 8;
for (var i = 0; i < n_nodes; i++) {
g.setNode(i, {
label: i
});
}
g.nodes().forEach(function(v) {
var node = g.node(v);
node.shape = "circle";
});
// Set edges
g.setEdge(0, 1);
g.setEdge(1, 2);
g.setEdge(2, 3);
g.setEdge(3, 4);
g.setEdge(4, 5);
g.setEdge(1, 1);
g.setEdge(1, 6);
g.setEdge(6, 7);
g.setEdge(7, 0);
g.setEdge(7, 4);
// Create the renderer
var render = new dagreD3.render();
// Set up an SVG group so that we can translate the final graph.
var svg = d3.select("svg");
// Run the renderer. This is what draws the final graph.
render(svg, g);
.node {
pointer-events: none;
}
.node circle {
stroke: darkgray;
fill: lightgray;
}
.edgePath path {
stroke: black;
}
<script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dagre-d3/0.6.1/dagre-d3.min.js"></script>
<svg width=960 height=600></svg>
Dagre解决了我们的问题。它正是我们需要的。