Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JUNG显示树木布局,但间距和结构更整齐_Java_Graph_Graph Visualization_Graphml_Jung2 - Fatal编程技术网

Java 如何使用JUNG显示树木布局,但间距和结构更整齐

Java 如何使用JUNG显示树木布局,但间距和结构更整齐,java,graph,graph-visualization,graphml,jung2,Java,Graph,Graph Visualization,Graphml,Jung2,我试图使用JUNG在树布局中布置一些节点,但希望以整齐的间距布置它们,类似于- 我从下载了JUNG项目,并找到了edu.uci.ics.JUNG.samples.TreeLayoutDemo和edu.uci.ics.JUNG.samples.GraphFromGraphMLDemo的示例,但仍在努力实现我的目标 GraphML文件内容如下所示- <?xml version="1.0" encoding="UTF-8"?> <graphml xmlns="http://grap

我试图使用JUNG在树布局中布置一些节点,但希望以整齐的间距布置它们,类似于-

我从下载了JUNG项目,并找到了edu.uci.ics.JUNG.samples.TreeLayoutDemo和edu.uci.ics.JUNG.samples.GraphFromGraphMLDemo的示例,但仍在努力实现我的目标

GraphML文件内容如下所示-

<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns  http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
   <graph id="G" edgedefault="undirected">
      <node id="n0" />
      <node id="n1" />
      <node id="n2" />
      <node id="n3" />
      <node id="n4" />
      <node id="n5" />
      <node id="n6" />
      <node id="n7" />
      <node id="n8" />
      <node id="n9" />
      <node id="n10" />
      <edge source="n0" target="n2" />
      <edge source="n1" target="n2" />
      <edge source="n2" target="n3" />
      <edge source="n3" target="n5" />
      <edge source="n3" target="n4" />
      <edge source="n4" target="n6" />
      <edge source="n6" target="n5" />
      <edge source="n5" target="n7" />
      <edge source="n6" target="n8" />
      <edge source="n8" target="n7" />
      <edge source="n8" target="n9" />
      <edge source="n8" target="n10" />
   </graph>
</graphml>

我已经能够生成一个树布局

private Supplier<MutableNetwork<Number, Number>> graphFactory;
private Supplier<Number> nodeFactory;
private Supplier<Number> edgeFactory;
private GraphMLReader<MutableNetwork<Number, Number>, Number, Number> gmlreader;

private void initializeTools() throws ParserConfigurationException, SAXException {
    graphFactory =
            () -> NetworkBuilder.directed()
                    .allowsSelfLoops(true)
                    .allowsParallelEdges(true)
                    .build();
    nodeFactory =
            new Supplier<Number>() {
                int n = 0;

                public Number get() {
                    return n++;
                }
            };
    edgeFactory =
            new Supplier<Number>() {
                int n = 0;

                public Number get() {
                    return n++;
                }
            };
    gmlreader =
            new GraphMLReader<>(nodeFactory, edgeFactory);
}

private MutableNetwork<Number, Number> getGraph() {
    MutableNetwork<Number, Number> graph = null;

    String xml =
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                    + "<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
                    + "xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\">"
                    + "   <graph id=\"G\" edgedefault=\"undirected\">\n" +
                    "      <node id=\"n0\" />\n" +
                    "      <node id=\"n1\" />\n" +
                    "      <node id=\"n2\" />\n" +
                    "      <node id=\"n3\" />\n" +
                    "      <node id=\"n4\" />\n" +
                    "      <node id=\"n5\" />\n" +
                    "      <node id=\"n6\" />\n" +
                    "      <node id=\"n7\" />\n" +
                    "      <node id=\"n8\" />\n" +
                    "      <node id=\"n9\" />\n" +
                    "      <node id=\"n10\" />\n" +
                    "      <edge source=\"n0\" target=\"n2\" />\n" +
                    "      <edge source=\"n1\" target=\"n2\" />\n" +
                    "      <edge source=\"n2\" target=\"n3\" />\n" +
                    "      <edge source=\"n3\" target=\"n5\" />\n" +
                    "      <edge source=\"n3\" target=\"n4\" />\n" +
                    "      <edge source=\"n4\" target=\"n6\" />\n" +
                    "      <edge source=\"n6\" target=\"n5\" />\n" +
                    "      <edge source=\"n5\" target=\"n7\" />\n" +
                    "      <edge source=\"n6\" target=\"n8\" />\n" +
                    "      <edge source=\"n8\" target=\"n7\" />\n" +
                    "      <edge source=\"n8\" target=\"n9\" />\n" +
                    "      <edge source=\"n8\" target=\"n10\" />\n" +
                    "   </graph>" +
                    "</graphml>";

    BufferedWriter writer = null;
    try {
        writer = new BufferedWriter(new FileWriter("temp.graphml"));
        writer.write(xml);
        writer.close();
        graph = graphFactory.get();
        gmlreader.load("temp.graphml", graph);

    } catch (Exception e) {
        e.printStackTrace();
    }

    return graph;
}
私人供应商graphFactory;
私人供应商节点工厂;
私人供应商边缘工厂;
专用图形阅读器gmlreader;
private void initializeTools()引发ParserConfiguration异常,SAXException{
石墨厂=
()->NetworkBuilder.directed()
.AllowSelfLoops(真)
.allowsParallelEdges(真)
.build();
节点特性=
新供应商(){
int n=0;
公共号码get(){
返回n++;
}
};
边缘学=
新供应商(){
int n=0;
公共号码get(){
返回n++;
}
};
gmlreader=
新GraphMLReader(nodeFactory、edgeFactory);
}
私有可变网络getGraph(){
可变网络图=空;
字符串xml=
""
+ ""
+“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“\n”+
"   " +
"";
BufferedWriter=null;
试一试{
writer=newbufferedwriter(newfilewriter(“temp.graphml”);
write.write(xml);
writer.close();
graph=graphFactory.get();
gmlreader.load(“温度图”,图形);
}捕获(例外e){
e、 printStackTrace();
}
返回图;
}
用作-

    initializeTools();

    final MutableNetwork<Number, Number> graph = getGraph();

    // create a simple graph for the demo
    TreeLayoutAlgorithm<Number> layoutAlgorithm = new TreeLayoutAlgorithm<>();
    vv = new VisualizationViewer<>(graph, layoutAlgorithm, new Dimension(800, 800));
initializeTools();
最终可变网络图=getGraph();
//为演示创建一个简单的图形
TreeLayoutAlgorithm layoutAlgorithm=新的TreeLayoutAlgorithm();
vv=新的VisualizationViewer(图形、布局算法、新维度(800800));

我无法让它完全展示我的期望或努力。这就是它的外观-

这是一个特定“整洁”树布局的实现:


您可能会将它重新安装到您正在使用的jung版本中。

JungraphtT工作得非常好!-


谢谢

哇!我对荣格拉夫特的形象化一无所知。我要去看看,很高兴能奏效。您可以使用edgePredicate设置来防止J1根子树被节点I2“窃取”。GraphView遍历遵循传出边,但如果添加edgePredicate(获取传出边)之类的内容,除非边目标有多条传入边,并且其中一条传入边的源是树的根”。对于这样的图,您可能也喜欢SugiyaMalayout算法。