我的最终目标是编写一个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个静态的独立部分。目前,水果的位置会根据其指向的节点而不断变化。
如果我的解释不明确,请告诉我,我会尽力解释。谢谢。 没有足够的声誉直接发布图像。
答案 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; // !!!
}
给你
如果要强制执行某些顺序的项目(例如,苹果位于香蕉的左侧),可以通过将定义替换为
subgraph cluster_top{
{ rank = same; apple -> banana[ style = invis ] }
}
答案 1 :(得分:0)
如果我正确理解了您,则需要将边缘不可见的群集连接起来以强制其位置。
在这里,我向每个群集中添加了一个虚拟节点(因为要连接群集,必须先连接这些群集中的节点,然后添加lhead和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;
}