【问题标题】:How to draw multiple graphs with dot?如何用点绘制多个图形?
【发布时间】:2011-03-17 17:12:19
【问题描述】:

我有一个在标准输出上输出点的print_dot() 函数。 这样我就可以做到:

$ ./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 输出连接到 dot 并不能解决问题。

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

【问题讨论】:

    标签: graphviz dot


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      使用gvpack

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

      结果

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-01
          • 1970-01-01
          • 2020-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多