【问题标题】:Horizontally partitioning nodes in a graph在图中水平划分节点
【发布时间】:2015-05-29 15:17:53
【问题描述】:

我正在使用dot 命令生成一个图表,在本例中是一系列软件版本,显示版本之间的关系。

假设:

  • 每个版本都有一个数字,数字越大表示后续版本。
  • 每个版本必须高于图表中的早期版本。
  • 每个版本都基于特定的早期版本,不一定是最新版本。
  • 每个“基于”关系都显示为从一个节点到另一个节点的箭头。
  • 出于对问题不重要的原因,某些版本的子集是独立的。我称它们为“alt”版本。 “Alt”版本可以基于非“alt”版本,反之亦然。 (碰巧我对非“alt”版本更感兴趣,但我想要图表中的所有版本。)

我可以生成一个图表,清楚地显示版本之间的关系,但我也想将所有“alt”版本放在垂直图的右侧,将所有非“alt”版本放在左侧side -- 同时保留所有关系信息(这意味着箭头从图表的左侧到右侧,反之亦然)。

我尝试将“alt”节点放入子图/集群中,但这会丢失集群中节点与其外部节点之间的依赖关系(箭头)。

我还尝试在“中间”创建一个不可见节点,并在指定方向的同时定义从每个节点到“中间”节点的依赖关系,但我无法在同一个图中混合垂直和水平依赖关系。

这是我目前拥有的demo.dot 文件,它没有 做我想要的分区:

digraph releases {
// Use a box shape for all nodes
    node [shape=box];

// Define labels for nodes
    v106 [style=bold];
    v105 [label="v105 alt" style=dashed];
    v104;
    v103;
    v102 [label="v102 alt" style=dashed];
    v101 [style=bold];

// Define dependencies
    v106 -> v104;
    v106 -> v105 [style=dashed];
    v105 -> v102;
    v104 -> v101;
    v103 -> v101;
    v102 -> v101;

// Use [style=invisible dir=none] to ensure that a later node appears above
// an earlier one even if there's no dependency.
    v106 -> v105 [style=invisible dir=none];
    v105 -> v104 [style=invisible dir=none];
    v104 -> v103 [style=invisible dir=none];
    v103 -> v102 [style=invisible dir=none];
    v102 -> v101 [style=invisible dir=none];

}

这是使用dot -Tpng demo.dot -o demo.png生成的图像文件

我想要的是让所有“alt”节点都在一条不可见的垂直线的右侧,而所有其他节点都在它的左侧,所有箭头仍然在原位(必要时扭曲)。

有没有办法用dot 做到这一点?或者是否有其他工具(可在 Linux 上使用,特别是 Debian)可以做同样的事情?

【问题讨论】:

    标签: graphviz dot


    【解决方案1】:

    这是一个很晚的答案,但可能对其他人有所帮助。

    如果两个节点都属于同一个group,Graphviz 会尝试保持边缘笔直。

    digraph releases { nodesep=0.5
        // Use a box shape for all nodes
        node [shape=box];
    
        // Define regular nodes
        {
            node [group=regular];
            v106 [style=bold];
            v104;
            v103;
            v101 [style=bold];
        }
    
        // Define alt nodes
        {
            node [group=alt style=dashed];
            v102 [label="v102 alt"];
            v105 [label="v105 alt"];
        }
    
        // Define dependencies
        v106 -> v104;
        v106 -> v105 [style=dashed];
        v105 -> v102;
        v104 -> v101;
        v103 -> v101;
        v102 -> v101;
    
        // Use [style=invisible dir=none] to ensure that a later node appears above
        // an earlier one even if there's no dependency.
        edge [style=invisible dir=none];
        v106 -> v105;
        v105 -> v104;
        v104 -> v103;
        v103 -> v102;
        v102 -> v101;
    
    }
    

    给予

    【讨论】:

    • 这并不完全符合我的要求,但我认为它确实改善了我实际测试用例的布局。
    【解决方案2】:

    尝试做类似的事情。将此添加到您的代码中就很接近了:

    subgraph cluster_alt {
        graph [style= invisible];
        edge [style = invisible, arrowhead=none];
        weight = 10;
        v102 -> v105;
    }
    
    subgraph cluster_main {
        graph [style= invisible];
        edge [style = invisible, arrowhead=none];
        weight = 10;
        v106 -> v105-> v104->v103->v102->v101;
    }
    

    给我:

    “权重”属性将这些不可见子图中的边推向比其他边(您已经定义的可见边)更垂直的方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-10
      • 2021-11-30
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多