我的最终目标是编写一个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
中,重要的是在工具看到它时产生层次结构,而不是重现你脑海中的逻辑。只需将篮子的边缘翻转到“较低”的水果即可:
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 ] }
}
如果我正确地理解了你,你需要连接具有不可见边缘的簇来强制它们的位置。
在这里,我在每个集群中添加了一个虚拟节点(因为要连接集群,您必须连接这些集群中的节点,然后添加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;
}