graphviz - 如何将此点程序中的节点调整为 2 x 3 表?
问题描述
我使用 graphviz 绘制图表。
节点的位置并不理想。我希望将六个节点大致放置在 2 x 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"];
}
解决方案
这里的关键是使用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>>];
}
这给了你
推荐阅读
- wordpress - 如何为wordpress中的所有帖子创建一个特定的详细页面?
- apache-nifi - Apache Nifi - ConvertJSONToSQL - JSON 没有所需列的值
- c# - 来自后端的警报
- javascript - 使用 Angular http 服务集成 API 时出错
- c - 内存地址和内容
- python - python list() 在与 ipython notebook 中的另一个操作嵌套时删除整个列表
- ssh - 如何在代码中动态更新现有 Airflow(1.9 版本)Connection 的参数?
- c# - 如何在 .NET 中以编程方式设置 Windows 10 夜灯
- db2 - 通过 SQL Developer 从 DB2 导出 Excel 中的问号而不是文本
- html - 为什么 [id] 的 CSS 选择器会带来比预期更多的匹配文本?