【问题标题】:Earlier graphviz rank较早的graphviz排名
【发布时间】:2021-03-15 03:21:46
【问题描述】:

在下图中,我是否可以设置一个属性来使 A 和 H 处于同一等级;和D和G在同一个等级?对于我的用例,每个节点都是一个进程,它将在传入节点进程完成后立即开始,我希望节点的位置指示开始时间。

digraph {
    A -> B
    B -> C
    H -> C
    C -> D
    D -> E
    E -> F
    C -> G
    G -> F
}

我希望结果如下所示,但由于这些图表是动态生成的,我不想计算我应该将哪些节点标记为相同等级。

digraph {
    { rank="same"; A; H }
    { rank="same"; D; G }
    A -> B
    B -> C
    H -> C
    C -> D
    D -> E
    E -> F
    C -> G
    G -> F
}

【问题讨论】:

  • rankdir="BT" 有效吗?
  • 不,它提供了第一张图像的垂直翻转。排名保持不变:H 在 B 旁边,G 在 E 旁边。

标签: graphviz


【解决方案1】:

您要查找的内容作为 Flying Logic 软件中的设置存在,在那里被称为偏差。

不幸的是,在我回答时(2021 年 3 月),这还不存在。请在 Twitter 上查看一位长期维护者对我的问题的回答。 https://twitter.com/Graphviz/status/1128339044826517508?s=20

【讨论】:

    【解决方案2】:

    这个 gvpr (https://www.graphviz.org/pdf/gvpr.1.pdf) 程序似乎正确地添加了带有 rank=same 的子图,以按要求“提升”节点。
    请注意,如果源图有子图(尤其是集群),不要指望它会起作用。

    BEGIN {
      int i, j, n, s=0, changed=0; 
      int checkedNode[];
      int newRank[];
      string str1, rankString[], fld[int];
      node_t aNode, headNode;
      edge_t anEdge;
      graph_t aSub;
    }
    BEG_G{
      for (aNode=fstnode($G); aNode; aNode = nxtnode(aNode)){
        if (aNode.indegree==0){
          newRank[aNode]=1;
        }
      }
      while (1){
      for (newRank[aNode]){
        for (anEdge = fstout(aNode); anEdge; anEdge = nxtout(anEdge)){
          headNode=anEdge.head;
          if (newRank[headNode]=="" || (newRank[aNode]+1)>newRank[headNode]){
            newRank[headNode]=newRank[aNode]+1;
            print ("// rank=", newRank[headNode], "  ",  headNode.name);
        changed++;
          }
        }
      }
      if (changed==0)break;
      changed=0;
      }
      for (newRank[aNode]){
        rankString[newRank[aNode]]=sprintf("%s%s|",rankString[newRank[aNode]],aNode.name);
      }
      /* create subgraphs w/ rank=same */
      for (rankString[i]){
        unset(fld);
        n=tokens(rankString[i],fld,"|");
        if (n>1){
          str1=sprintf("__sub_%d",++s);    
          aSub=subg($G,str1);
          aSub.rank="same";
          for (j=0;j<n;j++){
            print ("// fld: >", fld[j], "<  ", j, "  ", n);
            aNode=node($G, fld[j]);
            aNode=subnode(aSub, aNode);
          }
        }
      }
    }
    

    像这样使用命令行:

    gvpr -c -f raiseRanks.gvpr  yourfile.gv | dot -Tpng >yourfile.png 
    

    给予:

    // comments deleted
    igraph {
            subgraph __sub_1 {
                    graph [rank=same];
                    A;
                    H;
            }
            subgraph __sub_2 {
                    graph [rank=same];
                    D;
                    G;
            }
            A -> B;
            B -> C;
            C -> D;
            C -> G;
            H -> C;
            D -> E;
            E -> F;
            G -> F;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2013-10-18
      • 1970-01-01
      相关资源
      最近更新 更多