0

如果我对 Graphstream 图中的某些节点有一些固定的坐标,我可以让 Graphstream “填补空白”并自动布局那些没有手动指定位置的节点吗?

例如:

Node n1 = graph.addNode("n1");
n1.setAttribute("xy",-0.1,53.35);
Node n2 = graph.addNode("n2");
graph.addEdge("n1n2",n1,n2);
Node n3 = graph.addNode("n3");
n3.setAttribute("xy",-0.4,56.35);
graph.addEdge("n2n3",n2,n3);

鉴于上述情况,n2 没有指定位置。是否可以要求 GraphStream 推断它,而不是因为它不知道它在哪里而不显示它?

如果我使用viewer.disableAutoLayout();,它不会显示未定位的节点;如果我使用viewer.enableAutoLayout();它,它会忽略我的手动节点位置。

4

1 回答 1

1

尽管推断的位置不是已知位置的平均值,但有一些设置可用于(某种程度上)执行此操作。

改编上面的代码:

Node n1 = graph.addNode("n1");
n1.setAttribute("xy",-0.1,53.35);
n1.addAttribute("layout.frozen");
Node n2 = graph.addNode("n2");
graph.addEdge("n1n2",n1,n2);
Node n3 = graph.addNode("n3");
n3.setAttribute("xy",-0.4,56.35);
n3.addAttribute("layout.frozen");
graph.addEdge("n2n3",n2,n3);

SpringBox layout = new SpringBox(false,new Random(0));
viewer.enableAutoLayout(layout);

layout.frozen属性添加到具有已知位置的那些节点,将防止它们被布局管理器移动。

然而,推断的位置/边缘长度不一定与已知的位置/边缘长度相同。这可以通过layout.weight在每个节点和每条边上设置一个属性来调整 - 作为一个大于 0 的数字。在节点上,这设置每个节点排斥相邻节点的程度;在边缘上,它是目标边缘长度的乘数。有关更多详细信息,请参阅文档

于 2020-02-24T14:40:00.507 回答