对齐Graphviz有向图中的节点

对齐Graphviz有向图中的节点,graphviz,Graphviz,我有以下Graphviz代码: digraph { Technique [shape = box]; Path [shape = box]; KnowledgeObservation [shape = box, label = "Knowledge\nObservation"]; ManagementIntervention [shape = box, label = "Management\nIntervention"]; ResultsModification [shap

我有以下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     
  }
}
它当前生成以下输出:

我如何将“管理干预”与“知识观察”和“结果修改”垂直对齐

“共享代码”应移至“管理干预”的左侧

“中介关系”应移到“管理干预”的右边

“共享代码”、“管理干预”和“中介关系”应保持水平对齐

我如何才能做到这一点?

我如何将“管理干预”与“知识观察”和“结果修改”垂直对齐

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

“中介关系”应移到“管理干预”的右边

您可以通过定义节点的顺序来控制这一点。如果您在“共享代码”之前定义“管理干预”,则将首先绘制它(MI),即。e、 ,位于SI的左侧

“共享代码”、“管理干预”和“中介关系”应保持水平对齐

使用
=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
将识别并维护层次关系,而不是以令人惊讶的方式解释含糊不清的指令