Как нарисовать несколько графиков с точкой?

У меня есть функция print_dot(), которая выводит точку на stdout. Таким образом я могу сделать:

$ ./myprogram < input | dot -T x11

Он отлично работает, когда я пытаюсь напечатать один график.

Теперь, когда я печатаю несколько графиков, ничего не появляется. Точечное окно пустое, X11 и точка принимают весь процессор. На 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 {
    ...
}

Кроме того, когда я удаляю \n между двумя графиками, интерпретируется только первый граф (какая хорошая функция...):

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

Повторное подключение вывода xdot к точке не устраняет проблему.

Итак, как можно сделать несколько графиков с помощью графика?

Ответ 1

Простой script, который читает графики на 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

Один вызов dot несколько раз. Или один помещает все в единый граф, стараясь избегать дублирования имен.

Ответ 3

Используйте gvpack

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

Результат

введите описание изображения здесь