如何在 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 ] }
}
我的最终目标是编写一个 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 ] }
}