如何用点绘制多个图形?

时间:2011-03-17 17:12:19

标签: graphviz dot

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

$ ./myprogram < input | dot -T x11

当我尝试打印一张图表时效果很好。

现在,当我打印几张图表时,什么都没有出现。点窗口为空白,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 {
    ...
}

此外,当我删除2个图表之间的\n时,只会解释第一个图表(这是一个不错的功能......):

$ echo -e "graph  { a -- b }  graph { c -- d } " | dot -T xdot
graph {
    ...
}

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

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

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

简单脚本,读取stdin上的图形并打开多个点实例。

#!/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;        
    }
}

答案 2 :(得分:2)

使用gvpack

$ echo -e "graph { a -- b }\ngraph { c -- d }" | gvpack -u | dot -Tpng > graphs.png

结果

enter image description here