如何用点绘制多个图形?

kna*_*arf 13 dot graphviz

我有一个print_dot()在stdout上输出点的函数.那样我可以这样做:

$ ./myprogram < input | dot -T x11
Run Code Online (Sandbox Code Playgroud)

当我尝试打印一个图形时它很有用.

现在当我打印几张图表时,什么都没有出现.点窗口为空白,X11和点占用所有CPU.stderr上没有打印任何内容.

$ echo -e "graph  { a -- b }" | dot -T x11 # work
$ echo -e "graph  { a -- b } \n graph { c --d }" | dot -T x11 # doesn't work

# it seems to be interpreted nonetheless
$ echo -e "graph  { a -- b } \n graph { c -- d } " | dot -T xdot
graph {
    ...
}
graph {
    ...
}
Run Code Online (Sandbox Code Playgroud)

此外,当我删除\n2个图形之间时,只解释第一个图形(这是一个很好的特性......):

$ echo -e "graph  { a -- b }  graph { c -- d } " | dot -T xdot
graph {
    ...
}
Run Code Online (Sandbox Code Playgroud)

再次将xdot输出管道连接到点不能解决问题.

那么,如何使用graphviz渲染多个图形?

Gar*_*han 8

一次打电话dot多次.或者将所有内容放在一个图表中,注意避免重复名称.

  • 浪费了3个小时.大. (3认同)

Pan*_*nic 6

gvpack

$ echo -e "graph { a -- b }\ngraph { c -- d }" | gvpack -u | dot -Tpng > graphs.png
Run Code Online (Sandbox Code Playgroud)

结果

在此处输入图片说明


kna*_*arf 4

读取标准输入上的图形并打开多个点实例的简单脚本。

#!/usr/bin/perl

my $o;
my @l;


while(<>) {
    if(/^\s*(di)?graph/) {
        push @l, $o;
        $o = '';
    }

    $o .= $_;
}

if($o =~ /graph/) {
    push @l, $o;
}

for(@l) {
    if(fork() == 0) {
        open my $p, '| dot -T x11' or die $!;
        print $p $_;
        close $p;
        exit 0;        
    }
}
Run Code Online (Sandbox Code Playgroud)