我可以最小化点图中的弧长吗?
Can I minimize arc length in dot graph?
我有一个相当受限的点图,它不是我想要的。
这些图旨在表示动态贝叶斯网络并具有任意数量的时间片。我需要一个时间片中的所有节点在同一个子图中垂直排序,并且每个子图水平对齐并且最好等距。
下面是这个问题底部的代码生成的乱七八糟的 DBN - 这是一个相对简单的例子,但应该能说明问题。我希望从 't-1' 到 't' 子图和 't' 到 't+1' 子图的弧看起来相同,并避免像 'c(t-1)' 这样的循环弧到'e(t)' 并且子图也是等距的。
将 'c(t-1)' 的权重调整为 'e(t)' 没有任何作用,生成此点文件的代码应该是通用的。
如果有更好的程序可以解决这类问题,我不喜欢 dot。
生成图表的代码是:
digraph G {
1 [ label = "a(t-1)" ];
2 [ label = "b(t-1)" ];
3 [ label = "c(t-1)" ];
4 [ label = "d(t-1)" ];
5 [ label = "e(t-1)" ];
6 [ label = "a(t)" ];
7 [ label = "b(t)" ];
8 [ label = "c(t)" ];
9 [ label = "d(t)" ];
10 [ label = "e(t)" ];
11 [ label = "a(t+1)" ];
12 [ label = "b(t+1)" ];
13 [ label = "c(t+1)" ];
14 [ label = "d(t+1)" ];
15 [ label = "e(t+1)" ];
rankdir=TB
edge[style=invis];
{
rank=same;
K_1 [style=invis] ;
K_2 [style=invis] ;
K_3 [style=invis] ;
K_1 -> K_2 ;
K_2 -> K_3 ;
}
subgraph cluster1 {
style=dotted ;
1 -> 2;
2 -> 3;
3 -> 4;
4 -> 5;
label="t-1" ;
}
subgraph cluster2 {
style=dotted ;
6 -> 7;
7 -> 8;
8 -> 9;
9 -> 10;
label="t" ;
}
subgraph cluster3 {
style=dotted ;
11 -> 12;
12 -> 13;
13 -> 14;
14 -> 15;
label="t+1" ;
}
K_3 -> 11[style=invis] ;
K_2 -> 6[style=invis] ;
K_1 -> 1[style=invis] ;
edge[constraint=false,style=solid] ;
3 -> 10 ;
8 -> 15 ;
}
自己找到了答案。
将排序方向更改为 LR,并在子图中使用出现顺序进行排序。
digraph G {
rankdir=LR
edge[style=invis];
subgraph cluster1 {
style=dotted ;
rank=same ;
K_1 [ style=invis ] ;
1 [ label = "a(t-1)" ];
2 [ label = "b(t-1)" ];
3 [ label = "c(t-1)" ];
4 [ label = "d(t-1)" ];
5 [ label = "e(t-1)" ];
label="t-1" ;
}
subgraph cluster2 {
style=dotted ;
rank=same ;
K_2 [style=invis] ;
6 [ label = "a(t)" ];
7 [ label = "b(t)" ];
8 [ label = "c(t)" ];
9 [ label = "d(t)" ];
10 [ label = "e(t)" ];
label="t" ;
}
subgraph cluster3 {
style=dotted ;
rank=same ;
K_3 [style=invis] ;
11 [ label = "a(t+1)" ];
12 [ label = "b(t+1)" ];
13 [ label = "c(t+1)" ];
14 [ label = "d(t+1)" ];
15 [ label = "e(t+1)" ];
label="t+1" ;
}
K_1 -> K_2 -> K_3 ;
edge[constraint=false,style=solid] ;
3 -> 10 ;
8 -> 15 ;
}
我有一个相当受限的点图,它不是我想要的。
这些图旨在表示动态贝叶斯网络并具有任意数量的时间片。我需要一个时间片中的所有节点在同一个子图中垂直排序,并且每个子图水平对齐并且最好等距。
下面是这个问题底部的代码生成的乱七八糟的 DBN - 这是一个相对简单的例子,但应该能说明问题。我希望从 't-1' 到 't' 子图和 't' 到 't+1' 子图的弧看起来相同,并避免像 'c(t-1)' 这样的循环弧到'e(t)' 并且子图也是等距的。
将 'c(t-1)' 的权重调整为 'e(t)' 没有任何作用,生成此点文件的代码应该是通用的。
如果有更好的程序可以解决这类问题,我不喜欢 dot。
生成图表的代码是:
digraph G {
1 [ label = "a(t-1)" ];
2 [ label = "b(t-1)" ];
3 [ label = "c(t-1)" ];
4 [ label = "d(t-1)" ];
5 [ label = "e(t-1)" ];
6 [ label = "a(t)" ];
7 [ label = "b(t)" ];
8 [ label = "c(t)" ];
9 [ label = "d(t)" ];
10 [ label = "e(t)" ];
11 [ label = "a(t+1)" ];
12 [ label = "b(t+1)" ];
13 [ label = "c(t+1)" ];
14 [ label = "d(t+1)" ];
15 [ label = "e(t+1)" ];
rankdir=TB
edge[style=invis];
{
rank=same;
K_1 [style=invis] ;
K_2 [style=invis] ;
K_3 [style=invis] ;
K_1 -> K_2 ;
K_2 -> K_3 ;
}
subgraph cluster1 {
style=dotted ;
1 -> 2;
2 -> 3;
3 -> 4;
4 -> 5;
label="t-1" ;
}
subgraph cluster2 {
style=dotted ;
6 -> 7;
7 -> 8;
8 -> 9;
9 -> 10;
label="t" ;
}
subgraph cluster3 {
style=dotted ;
11 -> 12;
12 -> 13;
13 -> 14;
14 -> 15;
label="t+1" ;
}
K_3 -> 11[style=invis] ;
K_2 -> 6[style=invis] ;
K_1 -> 1[style=invis] ;
edge[constraint=false,style=solid] ;
3 -> 10 ;
8 -> 15 ;
}
自己找到了答案。
将排序方向更改为 LR,并在子图中使用出现顺序进行排序。
digraph G {
rankdir=LR
edge[style=invis];
subgraph cluster1 {
style=dotted ;
rank=same ;
K_1 [ style=invis ] ;
1 [ label = "a(t-1)" ];
2 [ label = "b(t-1)" ];
3 [ label = "c(t-1)" ];
4 [ label = "d(t-1)" ];
5 [ label = "e(t-1)" ];
label="t-1" ;
}
subgraph cluster2 {
style=dotted ;
rank=same ;
K_2 [style=invis] ;
6 [ label = "a(t)" ];
7 [ label = "b(t)" ];
8 [ label = "c(t)" ];
9 [ label = "d(t)" ];
10 [ label = "e(t)" ];
label="t" ;
}
subgraph cluster3 {
style=dotted ;
rank=same ;
K_3 [style=invis] ;
11 [ label = "a(t+1)" ];
12 [ label = "b(t+1)" ];
13 [ label = "c(t+1)" ];
14 [ label = "d(t+1)" ];
15 [ label = "e(t+1)" ];
label="t+1" ;
}
K_1 -> K_2 -> K_3 ;
edge[constraint=false,style=solid] ;
3 -> 10 ;
8 -> 15 ;
}