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

How to structure multiple subgraphs in Graphviz?

我的最终目标是编写一个 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 个静态的独立部分。目前水果的位置根据它们指向的节点不断变化。

如果我的解释不清楚,请告诉我,我会尽力解释清楚。谢谢。 没有足够的声誉直接 post 图片。

如果我没理解错的话,你需要用不可见的边连接簇来强制它们的位置。

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

然后我用不可见的边缘以正确的顺序连接了这些簇。此外,我在这些边上添加了一个非常大的 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;

}

graphviz 中,重要的是生成工具所见的层次结构,而不是重现您脑海中的逻辑。只需将篮子的边缘翻转到 "lower" 水果即可:

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;     // !!!
}

给你

如果你想强制项目的特定顺序(例如苹果在香蕉的左边),你可以通过将你的定义替换为

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