【问题标题】:How to control subgraphs' layout in dot?如何控制点中子图的布局?
【发布时间】:2011-12-21 14:06:43
【问题描述】:

我有一个digraph,由许多不同大小的独立且简单的subgraphs 组成。 dot 将所有这些子图水平放置,所以我最终得到一个 40000x200 的输出文件,例如:

G1 G2 G3 G.....4 G5

我如何告诉dot 在两个维度上布局这些子图以获得类似:

G1 G2 G3
G.....4
G5

谢谢。

【问题讨论】:

    标签: graphviz dot


    【解决方案1】:

    实现这一点的步骤使用了多个graphviz工具,这些工具可以通过管道连接在一起。

    以下行是一个可能的配置,graph.dot 是包含您的图表的文件。您可能不得不摆弄选项。

    ccomps -x graph.dot | dot | gvpack -array3 | neato -Tpng -n2 -o graph.png
    

    下面是解释:


    1。分离断开的图

    工具:ccomps

    将图分解成它们的连通分量

    -x 选项(仅打印连接的组件,作为单独的图表)可能就足够了。


    2。布局每个图表

    工具:

    每个有向图都被一一布局。这一步是获取节点和边的位置所需要的。


    3。将所有布局的图表打包成一个

    工具:gvpack

    读取图形流,将图形组合成一个布局, 并生成单个图作为输入图的并集。

    您应该阅读此工具的选项文档并使用这些选项。例如,-array 用于以类似网格的方式对图形进行布局,并提供多个标志来控制布局。


    4。创建输出

    工具:neato

    选项-n2 告诉neato 不要布局输入图,而是使用现有的位置属性。


    示例图:

    digraph G {
     subgraph G1 {
        a->{b; c;};
     }
     subgraph G2 {
        d -> {e; f;};
     }
     subgraph G3 {
        g -> h;
     }
     subgraph G4 {
        i -> j;
     }
     subgraph G5 {
        {k; l;} -> m;
     }
    }
    

    编辑:在 gvpack 中对有向图进行排序

    为了确定gvpack 创建的组合布局中子图的出现顺序,每个子图都需要一个sortv 属性。

    例如以下图表:

    digraph G1 {
     sortv=1;
     a->{b; c;};
    }
    digraph G2 {
     sortv=2;
     d -> {e; f;};
    }
    digraph G3 {
     sortv=3;
     g -> h;
    }
    digraph G4 {
     sortv=4;
     i -> j;
    }
    digraph G5 {
     sortv=5;
     {k; l;} -> m;
    }
    

    可以使用

    进行转换
    dot graph.dot | gvpack -array_u | neato -Tpng -n2 -o graph.png
    

    导致

    【讨论】:

    • 谢谢。 ccomps 实际上只是将我的子图重写为有向图。真正的工作是由 gvpack 完成的。
    • 那么有没有办法对二合字母进行排序?
    • 是的,ccomps 分隔断开的图。如果您不需要这个,您可以从一开始就创建单独的图表。您可以为每个(子)图添加sortv 属性。 “u”标志表示插入顺序基于附加到每个图的 sortv 属性。 - 因此,使用gvpack -array_u3 应该按照图的sortv 的值对图的外观进行排序属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2023-03-04
    • 2015-02-06
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    相关资源
    最近更新 更多