【问题标题】:Align nodes in a Graphviz directed graph在 Graphviz 有向图中对齐节点
【发布时间】:2019-04-14 13:40:41
【问题描述】:

我有以下 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     
  }
}

它当前产生以下输出:

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

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

“中介关系”应移至“管理干预”右侧。

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

我怎样才能做到这一点?

【问题讨论】:

    标签: graphviz


    【解决方案1】:

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

    { 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 将识别并维护层级关系,而不是以令人惊讶的方式解释模棱两可的指令。

    【讨论】:

      【解决方案2】:

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

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

      “中介关系”应移至“管理干预”的右侧。

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

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

      你做对了,使用 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]
        }
      }
      

      结果:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-30
        • 2018-05-16
        • 2021-11-30
        • 1970-01-01
        • 1970-01-01
        • 2014-08-02
        • 1970-01-01
        • 2013-05-13
        相关资源
        最近更新 更多