GraphViz:使用 pos 属性的网格布局问题

GraphViz: trouble with grid layout using pos attribute

我正在尝试对齐此图,其目的是显示排序结果。 我需要一个通用的解决方案。 生成了点文件,所以我不能使用手动调整。

我试过 pospos!dot -ndot -Kneatodot -Kfdp 和其他东西。

这是来源(为人类的易懂性而设计):

digraph x {
  rankdir=LR

   11 [pos="1,1"]   21 [pos="2,1"]   31 [pos="3,1"]   41 [pos="4,1"]
   12 [pos="1,2"]   22 [pos="2,2"]   32 [pos="3,2"]   42 [pos="4,2"]
   13 [pos="1,3"]   23 [pos="2,3"]   33 [pos="3,3"]
   14 [pos="1,4"]   24 [pos="2,4"]

   11:e ->  21:w    21:e ->  31:w    31:e ->  41:w
   12:e ->  22:w    22:e ->  32:w    32:e ->  42:w
                    22:e ->  31:w
#                                                     41:e ->  21:w
#                                                     41:e ->  22:w 
#  12:e ->  12:w
#                                    32:e ->  32:w

   13:e ->  23:w    23:e ->  33:w
   14:e ->  24:w
#  13:e ->  14:w
#  14:e ->  13:w
#                   23:e ->  24:w
#                   24:e ->  23:w
}

在第一个渲染中,您基本上会看到它的外观(除了打乱的行顺序)。 以后的渲染图(包括循环边)应保留此基本布局。

dot -Tpng -o test.png test.dot:

取消循环边的注释后的一些效果图。

dot -Tpng -o test.png test.dot:

dot -Kneato -Tpng -o test.png test.dot:

dot -Kfdp -Tpng -o test.png test.dot:

没有像我的经验那样使用 pos(通过你的尝试确认),它不能很好地与 dot 引擎一起使用,并且与 neato 和其他我从未使用过的引擎一起使用能够生成类似网格布局的东西。

接近dot的三个一般步骤:

  • 将节点垂直rank = same
  • 对齐
  • 使用weight = 10(或任何其他有效的任意数字)水平对齐节点
  • 根据需要添加隐形垂直 struts(此处为 14 -> 12)
  • 确保您将边缘指向已建立的层次结构,这意味着在适当的地方明确使用 dir = back

我对你的情况的看法:

digraph 
{
    rankdir = LR;

    {rank = same; 14 -> 13 -> 12 -> 11[ style = invis ] }
    {rank = same; 24 -> 23 -> 22 -> 21[ style = invis ] }
    {rank = same; 33 -> 32 -> 31[ style = invis ] }
    {rank = same; 42 -> 41[ style = invis ] }

    14 -> 24[ weight = 10 ];
    13 -> 23 -> 33[ weight = 10 ];
    12 -> 22 -> 32 -> 42[ weight = 10 ];
    11 -> 21 -> 31 -> 41[ weight = 10 ];

    22:e -> 31:w;

    12:e -> 12:w
    32:e -> 32:w

    21:se ->  41:sw[ dir = back ];
    22:se ->  41:sw[ dir = back ];

    14 -> 12    [ color = red ];
    14:w -> 13:w
    13:e -> 14:e[ dir = back ];

    24:w -> 23:w
    23:e -> 24:e[ dir = back ];
}

产生