如何在Graphviz中构造多个子图?

时间:2019-04-01 13:06:16

标签: graphviz dot

我的最终目标是编写一个python脚本,该脚本将根据一些输入数据自动生成graphviz图。但是,我首先只关注graphviz。

这是我目前拥有的:

digraph G {
compound=true;
node [shape=box];
edge [dir=none];

subgraph cluster_overall{
        subgraph cluster_top{
        apple;
        banana;
        }
        subgraph clustermsc{
        basket1;
        basket2;
        label="Baskets";
        }
        subgraph cluster_bottom{
        orange;
        kiwi;
        }
label="Test";
}       
apple -> basket1;
banana -> basket2;
orange -> basket1;
kiwi -> basket2;
}

当前:https://i.imgur.com/76GCx0f.png

这就是我希望最终图形显示的样子。顶部和底部之间的水果数量平均分配(根据输入日期):

最终:https://i.imgur.com/OHFsAdd.png

如何将页面结构分为3个静态的独立部分。目前,水果的位置会根据其指向的节点而不断变化。

如果我的解释不明确,请告诉我,我会尽力解释。谢谢。 没有足够的声誉直接发布图像。

2 个答案:

答案 0 :(得分:1)

graphviz中,重要的是生成工具看到的层次结构,而不是重现您所想的逻辑。只需将篮子的边缘换成“较低”的水果就可以了:

digraph G {
compound=true;
node [shape=box];
edge [dir=none];

subgraph cluster_overall{
        subgraph cluster_top{
        apple;
        banana;
        }
        subgraph clustermsc{
        basket1;
        basket2;
        label="Baskets";
        }
        subgraph cluster_bottom{
        orange;
        kiwi;
        }
label="Test";
}       
apple -> basket1;
banana -> basket2;
basket1 -> orange;  // !!!
basket2-> kiwi;     // !!!
}

给你

enter image description here

如果要强制执行某些顺序的项目(例如,苹果位于香蕉的左侧),可以通过将定义替换为

subgraph cluster_top{
    { rank = same; apple -> banana[ style = invis ] }
    }

答案 1 :(得分:0)

如果我正确理解了您,则需要将边缘不可见的群集连接起来以强制其位置。

在这里,我向每个群集中添加了一个虚拟节点(因为要连接群集​​,必须先连接这些群集中的节点,然后添加lheadltail属性)。

然后,我以正确的顺序将这些群集与不可见的边缘相连。另外,我在这些边缘上添加了一个非常大的weight,以使其比其他边缘具有更高的优先级。

是您需要的吗?

digraph G {
    compound=true;
    node [shape=box];
    edge [dir=none];

    subgraph cluster_overall{
            subgraph cluster_top{
            dummy_top [shape=point width=0 style=invis]
            apple;
            banana;
            }
            subgraph clustermsc{
            dummy_msc [shape=point width=0 style=invis]
            basket1;
            basket2;
            label="Baskets";
            }
            subgraph cluster_bottom{
            dummy_bottom [shape=point width=0 style=invis]
            orange;
            kiwi;
            }
    label="Test";
    }
    dummy_top -> dummy_msc [
        style=invis
        weight=100
        lhead="clustermsc"
        ltail="cluster_top"
    ]
    dummy_msc -> dummy_bottom [
        style=invis
        weight=100
        lhead="cluster_bottom"
        ltail="clustermsc"
    ]
    apple -> basket1;
    banana -> basket2;
    orange -> basket1;
    kiwi -> basket2;

}