对齐 Graphviz 有向图中的节点

Align nodes in a Graphviz directed graph

我有以下 Graphviz 代码:

digraph {
  Technique [shape = box];
  Path [shape = box];
  KnowledgeObservation [shape = box, label = "Knowledge\nObservation"];
  ManagementIntervention [shape = box, label = "Management\nIntervention"];
  ResultsModification [shape = box, label = "Results\nModification"];
  SharedCode [label = "Shared Code"];
  MediatedRelationship [label = "Mediated Relationship"];
  Art -> Technique;
  Therapy -> Path;
  {Technique Path} -> KnowledgeObservation -> ManagementIntervention -> ResultsModification;
  {MediatedRelationship SharedCode} -> {KnowledgeObservation ResultsModification}

  subgraph {
    rank = same
    Technique -> Path [dir = none]
  }

  subgraph {
    rank = same
    SharedCode
    ManagementIntervention
    MediatedRelationship     
  }
}

它目前产生以下输出:

如何将 "Management Intervention" 与 "Knowledge Observation" 和 "Results Modification" 垂直对齐?

"Shared Code" 应该移到 "Management Intervention" 的左边。

"Mediated Relationship" 应该移到 "Management Intervention" 的右边。

"Shared Code"、"Management Intervention" 和 "Mediated Relationship" 应保持水平对齐。

我怎样才能做到这一点?

如何将 "Management Intervention" 与 "Knowledge Observation" 和 "Results Modification" 垂直对齐?

这可以通过增加边缘的 weight 来实现。 weight 较高的边比较低的边更直、更短。

"Mediated Relationship"应该移到"Management Intervention"的右边。

您可以通过定义节点的顺序来控制它。如果你定义"Management Intervention" before the "Shared Code",它(MI)将首先绘制,i。即,在 SI 的左侧。

"Shared Code"、"Management Intervention" 和 "Mediated Relationship" 应保持水平对齐。

你做对了,使用了 rank=same 子图属性。虽然我会把子图放在节点定义的那一刻。这将缩短源大小并将等级规范限制在定义节点的地方,这有利于可读性(所有内容都在一个地方说明)。


你修改的例子:

digraph {
  Technique [shape = box];
  Path [shape = box];
  KnowledgeObservation [shape = box, label = "Knowledge\nObservation"];
  ResultsModification [shape = box, label = "Results\nModification"];
  subgraph {
    rank=same

    ManagementIntervention [shape = box, label = "Management\nIntervention"];
    MediatedRelationship [label = "Mediated Relationship"];
    SharedCode [label = "Shared Code"];
  }
  Art -> Technique;
  Therapy -> Path;
  {Technique Path} -> KnowledgeObservation
  KnowledgeObservation -> ManagementIntervention -> ResultsModification [weight=3]
  {MediatedRelationship SharedCode} -> {KnowledgeObservation ResultsModification}

  subgraph {
    rank = same
    Technique -> Path [dir = none]
  }
}

结果:

这可以在没有子图的情况下实现;最重要的修改是行

{ rank = same; SharedCode -> ManagementIntervention -> MediatedRelationship[ style = invis ] }

这使得三个节点不仅在正确的级别上,而且在所需的顺序内。

总而言之,这段代码在这里

digraph 
{
  // node definition
  Art Therapy;
  Technique[ shape = box ];
  Path[ shape = box ];
  KnowledgeObservation[ shape = box, label = "Knowledge\nObservation" ];
  ManagementIntervention[ shape = box, label = "Management\nIntervention" ];
  ResultsModification[ shape = box, label = "Results\nModification" ];
  SharedCode[ label = "Shared Code" ];
  MediatedRelationship[ label = "Mediated Relationship" ];

  // edges
  Art -> Technique;
  Therapy -> Path;
  { rank = same; Technique -> Path [dir = none] }
  { Technique Path} -> KnowledgeObservation -> ManagementIntervention -> ResultsModification;
  { rank = same; SharedCode -> ManagementIntervention -> MediatedRelationship[ style = invis ] } 

  { MediatedRelationship SharedCode } -> { KnowledgeObservation ResultsModification }
}

给你

根据我的理解,这就是您要查找的内容。

我仍然建议用这三个替换最后一行代码

KnowledgeObservation -> { SharedCode MediatedRelationship }[ dir = back ];
SharedCode -> ResultsModification;
MediatedRelationship -> ResultsModification;

原因是,一旦您的图形变得更加复杂,graphviz 将识别并维护层次关系,而不是以令人惊讶的方式解释模棱两可的指令。