我正在尝试对齐此图,其目的是显示排序结果。 我需要一个一般的解决方案。 点文件已生成,因此我无法进行手动调整。
我尝试过pos
,pos
,!
,dot -n
,dot -Kneato
,dot -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
:
答案 0 :(得分:1)
根据我的经验,没有使用pos
(经您的尝试证实),它在dot
引擎,neato
和其他我从未能够使用的引擎上无法正常工作产生类似网格布局的东西。
与dot
接近的三个一般步骤:
rank = same
weight = 10
(或其他任何有效的任意数字)水平对齐节点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 ];
}
产生