graphviz - 我可以最小化点图中的弧长吗?

标签 graphviz dot bayesian-networks

我有一个相当受限的点图,它没有按照我想要的方式显示。

这些图旨在表示动态贝叶斯网络并具有任意数量的时间片。我需要一个时间片中的所有节点在同一子图中垂直排序,并且每个子图水平对齐并且最好等距。

下面是由本问题底部的代码生成的困惑的 DBN - 这是一个相对简单的示例,但应该可以说明问题。我希望从“t-1”到“t”子图和“t”到“t+1”子图的弧看起来相同,并避免像“c(t-1)”到“这样的循环弧” e(t)' 并且子图也等距。

将“c(t-1)”的权重调整为“e(t)”不会执行任何操作,并且生成此点文件的代码应该是通用的。

如果有更好的程序来解决此类问题,我不会选择 dot。

enter image description here

生成图表的代码是:

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,并使用出现顺序在子图中进行排序。

enter image description here

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 ;

}

关于graphviz - 我可以最小化点图中的弧长吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29528413/

相关文章:

r - 在 R 中使用 bnstruct 设置动态贝叶斯网络的层

c++ - iphone 的贝叶斯网络库?

generator - 脚本如何最佳地布局纯分层的graphviz/dot图?

racket - 如何使用 GraphViz 和 Racket

c++ - 有什么方法可以使用 C++ libgraph 为子图设置默认节点属性吗?

Graphviz (DOT),同一标签中的不同字体大小

doxygen - 从 doxygen 获取类层次结构点文件

graph - 如何使用 Dot 和 Graphviz 循环布局完整的图形?

c - 使用 C#、C/C++ 或 Java 改进带 GA 的 BBN

prolog - 如何使用 gvterm 生成点图