【问题标题】:Graphviz: tree structureGraphviz:树形结构
【发布时间】:2018-12-15 01:24:08
【问题描述】:

我想用graphviz生成结构树,这样的从左到右的结构(请忽略颜色):

我得出的结论是我需要使用不可见的节点来实现这一点,我当前的代码如下所示:

digraph G { 
  node [ shape="box", width = 2, height = 1, fixedsize=true];
  edge [arrowhead=none];
  nodesep = 1;
  ranksep=0.05;
  splines = ortho;
  rankdir = LR;

  A1 [ shape="box", width = 2, height = 1, fixedsize=true];
  B1 [ shape="box", width = 2, height = 1, fixedsize=true];
  B2 [ shape="box", width = 2, height = 1, fixedsize=true];
  B3 [ shape="box", width = 2, height = 1, fixedsize=true];
  B4 [ shape="box", width = 2, height = 1, fixedsize=true];
  B5 [ shape="box", width = 2, height = 1, fixedsize=true];
  B6 [ shape="box", width = 2, height = 1, fixedsize=true];

  W0 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];
  W1 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];
  W2 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];
  W3 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];
  W4 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];
  W5 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];
  W6 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];

  subgraph {
    A1 -> W0
    W0 -> W3
    W3 -> W2
    W2 -> W1
    W0 -> W4
    W4 -> W5
    W5 -> W6

    W1 -> B1
    W2 -> B2
    W3 -> B3
    W4 -> B4
    W5 -> B5
    W6 -> B6

    {rank = same; A1;}
    {rank = same; B1; B2; B3; B4; B5; B6;}
    {rank = same; W0; W1; W2; W3; W4; W5; W6;}
  }
}

使用点引擎我得到:

我的问题:

我可以强制某些节点占据中心位置(A1)吗?

我可以强制边缘连接到节点形状边框上的某些位置(例如:左中)吗?

也许有更好的方法来实现这种具有节点中心的树结构(我必须考虑到树的下一层可能相当复杂)

【问题讨论】:

    标签: graphviz


    【解决方案1】:

    为了得到你想要的,你需要

    • 按照您希望它们绘制的顺序定义节点(在此处给出的示例中不是绝对必要的,但很好的做法)
    • 确保空节点处于同一等级(您已经拥有)
    • 并以正确的顺序将这些空节点相互连接(这是这里的关键项)

    应用这些更改,并简化您的代码(您可能喜欢也可能不喜欢,这就是我的做法),我开始

    digraph G { 
      edge [arrowhead=none];
      nodesep = 1;
      ranksep=0.05;
      splines = ortho;
      rankdir = LR;
    
      node [ shape="box", width = 2, height = 1, fixedsize=true];
      A1;
      B4 B5 B6 B3 B2 B1;
    
      node [ shape="point", width = 0, height = 0 ];
      { rank = same; W4 W5 W6 W0 W3 W2 W1 }
    
      A1 -> W0;
      W4 -> W5 -> W6 -> W0 -> W3 -> W2 -> W1;        /* critical! */
      W1 -> B1;
      W2 -> B2;
      W3 -> B3;
      W4 -> B4;
      W5 -> B5;
      W6 -> B6;
    }
    

    产生

    【讨论】:

    • 将代码剪切并粘贴到webgraphviz.com 时(并删除#... 部分,因为它会引发语法错误)图片更好(顶部和底部的“箭头”在中间结束框(B4 / B1))。 dot 版本之间似乎存在差异。
    • 谢谢,@albert -- 已编辑以更改为正确的注释分隔符 /* comment */。我的点可能真的有点老了,graphviz version 2.38.0 (20140413.2041)
    • 谢谢 vaettchen 和 albert,这正是我所需要的。非常感谢。
    • W4 到 B4 不在 B4 的中心。有没有办法让它变得更好? W1 到 B1 也是一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    相关资源
    最近更新 更多