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

如何在Graphviz中构造多个子图?,graphviz,dot,Graphviz,Dot,我的最终目标是编写一个python脚本,根据一些输入数据自动生成graphviz图。然而,我首先只关注graphviz 这就是我目前拥有的: digraph G { compound=true; node [shape=box]; edge [dir=none]; subgraph cluster_overall{ subgraph cluster_top{ apple; banana; } subgraph cl

我的最终目标是编写一个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;
}
当前:

这就是我想要的最终图形。根据输入日期,水果数量均匀分布在顶部和底部区域:

最终:

如何将页面结构设置为具有3个静态、独立的部分。目前,水果的位置根据它们指向的节点不断变化

如果我的解释不清楚,请告诉我,我会尽力更好地解释。谢谢
没有足够的声誉来直接发布图像。

如果我正确理解你的意思,你需要将具有不可见边缘的簇连接起来,以强制它们的位置

在这里,我在每个集群中添加了一个虚拟节点,因为要连接集群,必须连接这些集群中的节点,然后添加和属性

然后我用不可见的边按正确的顺序连接这些簇。此外,我还为这些边添加了一个非常大的值,以使它们优先于其他边

这就是你需要的吗

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中,重要的是生成工具所看到的层次结构,而不是复制您头脑中的逻辑。只需将篮子的边缘翻转到较低的水果上即可:

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 ] }
    }

我基本上想有三个部分是具体的顺序。方法有点复杂,但仍然有效,谢谢!刚接触graphviz,显然对边缘了解不够。感谢您提供的简单解决方案和解释。