【问题标题】:How to structure multiple subgraphs in Graphviz?如何在 Graphviz 中构造多个子图?
【发布时间】:2019-04-01 23:20:03
【问题描述】:

我的最终目标是编写一个 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


    【解决方案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 ] }
        }
    

    【讨论】:

    • Graphviz 新手,显然对边缘了解不够。感谢您提供简单的解决方案和解释。
    【解决方案2】:

    如果我理解正确的话,你需要用不可见的边缘连接簇来强制它们的位置。

    这里我在每个集群中添加了一个虚拟节点(因为要连接集群,您必须连接这些集群中的节点,然后添加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;
    
    }
    

    【讨论】:

    • 我基本上想要三个部分是特定的顺序。有点复杂的方法,但仍然有效,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-01-01
    • 2020-03-25
    • 2023-03-12
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多