14

print_dot()stdoutにドットを出力する機能があります。そのように私はすることができます:

$ ./myprogram < input | dot -T x11

1つのグラフを印刷しようとするとうまくいきます。

いくつかのグラフを印刷すると、何も表示されません。ドットウィンドウは空白で、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で複数のグラフをレンダリングするにはどうすればよいでしょうか。

4

3 に答える 3

8

1回はdot複数回呼び出します。または、名前の重複を避けるように注意しながら、すべてを1つのグラフにまとめます。

于 2011-03-17T17:21:00.103 に答える
6

使用するgvpack

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

結果

ここに画像の説明を入力してください

于 2018-02-23T12:20:08.247 に答える
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;        
    }
}
于 2011-03-24T18:47:42.267 に答える