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

问题描述 投票:0回答:2

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

如果我的解释不清楚,请告诉我,我会更好地解释一下。谢谢。没有足够的重新定位来直接发布图像。

graphviz dot
2个回答
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 ] }
    }

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;

}

© www.soinside.com 2019 - 2024. All rights reserved.