哪个图形可视化库适合静态节点和带有文本的边?

时间:2019-04-22 08:32:45

标签: graphviz graph-visualization

我想用Java实现图形。我定义了类Node和类Edge,并且该图用节点列表表示,并且对于每个节点,从该节点开始的边的列表定义为该节点的字段。现在,我想使用一些Java库来可视化图形。

目前,我已经尝试过graphviz-java。结果符合我的要求,但边缘和节点放置得不好。请参见下图:

graphviz-java result

我通过遍历图的节点列表而不是生成原始点文件文本,使用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。

2 个答案:

答案 0 :(得分:1)

支持所有graphviz属性(https://graphviz.gitlab.io/_pages/doc/info/attrs.html)。

  • 节点距离设置为“ ranksep”和“ nodesep”。
  • 要强制将节点置于同一级别,请添加一个带有“ rank = same”的子图和应对齐的节点。

这是一个简单的例子:

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)

该图对我来说很好。 “我希望节点和边调整位置以使图形显示更好。”是什么意思?