Graphviz:如何呈现一个图形以尊重特定的节点-边连接点?

5

我希望能够呈现一个类似于以下图片的布局:

wanted

我尝试了以下方法:

digraph EDP
{
  graph [colorscheme=paired12];
  node [label="\N", shape=box, style="rounded,filled", colorscheme=paired12, color=8, fillcolor=7, width="1.2", fontname="Arial narrow", fontsize=12];
  edge [colorscheme=paired12, color=8, fontsize=11, fontname="Arial narrow"];

  src [label="Source"];
  dst [label="Destination"];
  filter [label="Filter"];

  src -> dst [label="Encoding process"];
  src -> filter [label="a"];
  filter -> dst [label="b"];
  src -> filter [dir=back, label=c];
  filter -> dst [dir=back, label=d];
  src -> dst [dir=back, label="Decoding process"];

}

生成了以下结果:(不太好看...)

my

有人能给我展示最接近的解决方案吗?(可能不能完全相同)

1个回答

9
在结束前我最接近的情况是:
digraph EDP
{
  graph [colorscheme=paired12];

  node [label="\N", shape=box, style="rounded,filled", colorscheme=paired12, color=8, fillcolor=7, width="1.2", fontname="Arial narrow", fontsize=12];
  edge [colorscheme=paired12, color=8, fontsize=11, fontname="Arial narrow"];

  src [width=3.5, label="Source"];
  dst [width=3.5, label="Destination"];
  filter [label="Filter"];

  edge[constraint=false];
  src -> dst [label="Encoding\nprocess"];
  src -> filter [label="a"];
  filter -> dst [label="b"];
  dst -> filter [label="c"];
  filter -> src [label="d"];
  dst -> src [label="Decoding\nprocess"];

  edge[style=invis, constraint=true];
  src->filter->dst;

}

将图形保存为edp.gv,并使用以下命令创建图像:

dot -Gsplines=none edp.gv | neato -n -Gsplines=ortho -Tpng -o edp.png

结果:

最接近的Graphviz输出

一些备注:

  • 我最终决定在所有边上加上constraint=false,并添加不可见的边使三个节点居中
  • 通常我喜欢使用dir=back,但是当使用-Gsplines=ortho渲染时无法使用
  • 正如您所看到的,边的顺序是随机的...

你是一个Graphviz的高手!谢谢,太棒了。我必须学习一些关于“neato”的东西——我还没有使用过它... - clt60
很高兴能帮上忙!请查看neato文档,这种情况下,-n标志告诉neato不要计算节点的位置(它们已经由dot计算过了)。 - marapet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接