GraphViz:使用 pos 属性的网格布局问题
GraphViz: trouble with grid layout using pos attribute
我正在尝试对齐此图,其目的是显示排序结果。
我需要一个通用的解决方案。
生成了点文件,所以我不能使用手动调整。
我试过 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
:
没有像我的经验那样使用 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 ];
}
产生
我正在尝试对齐此图,其目的是显示排序结果。 我需要一个通用的解决方案。 生成了点文件,所以我不能使用手动调整。
我试过 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
:
没有像我的经验那样使用 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 ];
}
产生