Как я могу настроить узлы в этой точечной программе в таблицу 2 на 3? - PullRequest
0 голосов
/ 22 ноября 2018

Я использую Graphviz, чтобы нарисовать диаграмму.

enter image description here

Расположение узлов не идеальное.Я хотел бы, чтобы шесть узлов были приблизительно размещены в таблице 2 на 3:

file_in   stdin_in     string_in

file_out  stdout_out   variable_out

Я пытался добавить веса к некоторым ребрам, но все еще не удается переместить узлы в такую ​​таблицу.Смотрите мою точечную программу ниже.Спасибо.

digraph G {

/* directly betw inputs */
node [color=black]
string_in -> stdin_in [label="redirection"];
 file_in -> stdin_in [label="redirection"];
 stdin_in -> file_in [label="device file /dev/stdin, or arg -", weight=8];
 stdin_in -> string_in [label="xargs"]; 

/* directly betw outputs */
node [color=red]
edge [color=red]
  stdout_out -> file_out [label="redirection" fontcolor="red"];
  file_out -> stdout_out [label="/dev/stdout or arg -" fontcolor="red"];

/* directly from input to output */
edge [color=blue]
 stdin_in -> stdout_out [label="cat or tee" fontcolor="blue" weight=8];
 stdin_in -> file_out [label = "tee > /dev/null" fontcolor = "blue"]; 
 string_in -> stdout_out [label="echo -n" fontcolor="blue" weight=2];
 file_in -> stdout_out [label="cat" fontcolor="blue"];
 file_in -> file_out [label="none" fontcolor="blue"];
 string_in -> variable_out [label="assignment" fontcolor="blue"];

/* directly from output to input */
edge [color=green]
 stdout_out -> stdin_in [label="pipe" fontcolor="green"];
 stdout_out -> file_in  [label="process substitution"  fontcolor="green"];
 stdout_out -> string_in [label="command substitution"  fontcolor="green"];
 file_out -> file_in [label="none"  fontcolor="green"];
 variable_out -> string_in [label="parameter expansion"  fontcolor="green"];
}

1 Ответ

0 голосов
/ 22 ноября 2018

Ключевым моментом здесь является использование rank = same;Я добавил эту инструкцию вверху вашего кода.Я также увеличил расстояние между двумя уровнями ранга, чтобы было больше места для меток ребер.Я также изменил веса, которые вы дали краям, чтобы иметь вид, похожий на матрицу.

Я бы порекомендовал еще две вещи:

  • , а не HTML-подобный синтаксисдля узла используйте стандартный формат graphviz;по вкусу, но мне легче читать, и он более гибкий, см. ( Как избежать `>` в метке ребра? ),
  • при создании ребер из узлов нижев иерархии к высшим не используйте b->a, а пишите a->b[dir="back"];это позволяет избежать путаницы в Graphviz при увеличении числа узлов

Я не полностью отредактировал файл, так как он не является строго необходимым для двух только что упомянутых элементов - вот работа, которую я сделал:

digraph G {

# layout
ranksep = 2
{ rank = same; file_in stdin_in string_in }
{ rank = same; file_out stdout_out variable_out }

/* directly betw inputs */
node [color=black]
 string_in -> stdin_in [label="redirection"];
 file_in -> stdin_in [label="redirection"];
 stdin_in -> file_in [label="device file /dev/stdin, or arg -"] 
 stdin_in -> string_in [label="xargs"]; 

/* directly betw outputs */
node [color=red]
edge [color=red]
  stdout_out -> file_out [label=<<font color="red">redirection</font>>];
  file_out -> stdout_out [label=<<font color="red">/dev/stdout or arg -</font>>];

/* directly from input to output */
edge [color=blue]
 stdin_in -> stdout_out [label=<<font color="blue">cat or tee</font>> weight = 10];
 # stdin_in -> file_out [label=<<font color="blue">tee /dev/null</font>>]; 
 stdin_in -> file_out[ label = "tee > /dev/null" fontcolor = "blue" ];
 string_in -> stdout_out [label=<<font color="blue">echo -n</font>> ];
 file_in -> stdout_out [label=<<font color="blue">cat</font>> ];
 file_in -> file_out [label = "none" fontcolor = "blue" weight = 10];
 string_in -> variable_out [label = "assignment" fontcolor = "blue" weight = 10 ];

/* directly from output to input */
edge [color=green]
 stdout_out -> stdin_in [label=<<font color="green">pipe</font>>];
 stdout_out -> file_in  [label=<<font color="green">process substitution</font>>];
 stdout_out -> string_in [label=<<font color="green">command substitution</font>>];
 file_in -> file_out [label="none" fontcolor="green" dir = back ];
 variable_out -> string_in [label=<<font color="green">parameter expansion</font>>];
}

, что дает вам

enter image description here

...