Как нарисовать несколько графиков с точкой?
У меня есть функция 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
Результат
![введите описание изображения здесь]()