我想用Java实现图形。我定义了类Node
和类Edge
,并且该图用节点列表表示,并且对于每个节点,从该节点开始的边的列表定义为该节点的字段。现在,我想使用一些Java库来可视化图形。
目前,我已经尝试过graphviz-java。结果符合我的要求,但边缘和节点放置得不好。请参见下图:
我通过遍历图的节点列表而不是生成原始点文件文本,使用node(xxx)
,addLink()
之类的API创建了图。
创建图形的关键代码如下:
for (LiteralNode litNode : literalNodeArrayList)
{
MutableNode mutableNode = mutNode(litNode.getNodeElement());
for (Edge e : litNode.getEdgeList()) {
MutableNode endNode = mutNode(e.endNode.getNodeElement());
mutableNode.addLink(to(endNode.port(Compass.NORTH)).add(Arrow.VEE));
}
mutableNodes.add(mutableNode);
g.add(mutableNode);
}
基本上是带有循环的简单遍历。节点和边缘会根据情况进行动态更改。
我希望节点和边调整位置以使图形显示更好。我也尝试过使用json文件和d3js来可视化图形,但是我发现这些库过于注重显示大量的节点及其分布,而我并不需要。我喜欢带有一些分层结构的graphviz结构。所以我想得到一些建议。
我提到了json文件,因为如果没有Java库可用,我不妨尝试一些javascript库,例如d3js,并且仅将java作为后端工具来生成需要输入的json文件。因此,建议不仅限于Java。
答案 0 :(得分:1)
支持所有graphviz属性(https://graphviz.gitlab.io/_pages/doc/info/attrs.html)。
这是一个简单的例子:
Graph g = graph()
.graphAttr().with(attr("ranksep", .1), attr("nodesep", .1))
.with(graph().graphAttr().with(Rank.SAME).with(node("a"), node("c")))
.with(node("a").link("b"), node("b").link("c"));
答案 1 :(得分:0)
该图对我来说很好。 “我希望节点和边调整位置以使图形显示更好。”是什么意思?