如何使用Graphviz从点文件格式生成PNG图像

时间:2014-04-25 19:19:19

标签: java queue graphviz

我有一个实现优先级队列的java类。然后我有一个类测试,生成如下图:

digraph G {
Milan  (0.0)       ->     Turin  (1.2)       
Milan  (0.0)       ->     Montreal  (7.0)       
Turin  (1.2)       ->     Paris  (5.8)       
Turin  (1.2)       ->     Tokyo  (2.2)       
}

此图表保存在名为" queue"。

的文件中

现在我希望这个图表使用Graphviz显示在PNG图像中。 因此,我的测试文件的最后一次调用(在您优先创建并填充队列之后)是:

queue.toString("queue");

好的。 toString方法如下:

public void toString(String fileDot){
    try {
        FileOutputStream file = new FileOutputStream(fileDot); 
        PrintStream Output = new PrintStream(file); 
        Output.print(this.printQueue()); 
        Output.close(); 
        File f = new File(fileDot); 
        String arg1 = f.getAbsolutePath(); 
        String arg2 = arg1 + ".png"; 
        String[] c = {"dot", "-Tpng", arg1, "-o", arg2};
        Process p = Runtime.getRuntime().exec(c); 
        int err = p.waitFor(); 
    }
    catch(IOException e1) {
        System.out.println(e1);
    }
    catch(InterruptedException e2) {
        System.out.println(e2);
    }
}

private String printQueue() throws IOException {
    String g = new String("");
    char c = '"';
    g = g.concat("digraph G {\n");
    if(isEmpty()) 
        g = g.concat("    " + "Empty priority queue.");
    else {
        for(int i = 0; i < lastIndex; i++) {
            if(heap[2 * i] != null) { 
                g = g.concat("" + heap[i].elem + "  (" + heap[i].prior + ")   " + "   " + " -> " + "    " + "" + heap[i * 2].elem + "  (" + heap[i * 2].prior + ")       \n" );
                if(heap[2 * i + 1] != null) 
                    g = g.concat("" + heap[i].elem + "  (" + heap[i].prior + ")   " + "   " + " -> " + "    " + "" + heap[i * 2 + 1].elem + "  (" + heap[i * 2 + 1].prior + ")       \n" ); 
            } 
        } //end for
    } //end else  
    g = g.concat("}");
    return g;   
}

为什么不生成图像.png?我哪里错了? 当然我安装了Graphviz。 感谢

2 个答案:

答案 0 :(得分:10)

当我在命令行中通过.dot运行上面的dot文件时,我得到了:

$ dot -Tpng queue.dot -oqueue.png
Warning: queue.dot:2: syntax error in line 2 near '('

因此,节点名称中带括号的数字在dot语法中无效。如果删除它们,我希望成功创建.png文件。如果您需要输出中带括号的数字,我建议在GraphViz文档中查找节点标签。

我还注意到toString()对于创建.png文件的函数来说似乎不是一个特别明确的名称,因此更改函数名称可能是可取的。

答案 1 :(得分:2)

尝试使用dot的{​​{1}}选项代替-O。根据{{​​1}},这是它的作用:

  • 根据输入文件名自动生成输出文件名,并附加.'format'。 (导致忽略所有-ofile选项。)

所以你可以改变

-o

dot -?