如何将此点程序中的节点调整为 2 x 3 table?

How can I adjust the nodes in this dot program into a 2 by 3 table?

我用graphviz画图。

节点放置不理想。我希望将六个节点大致放置在 2 x 3 table:

file_in   stdin_in     string_in

file_out  stdout_out   variable_out

我已经尝试为一些边缘添加权重,但仍然无法将节点移动到这样的 table。请参阅下面的我的点程序。谢谢

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"];
}

这里的重点是使用rank = same;我已经在您的代码顶部添加了这条指令。我还增加了两个级别之间的距离,以便边缘标签有更多 space。我还更改了您赋予边缘的权重,以便具有类似矩阵的外观。

还有两件事我会推荐:

  • 而不是节点的 HTML-like 语法,使用标准的 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>>];
}

这给了你