在图中水平分区节点

时间:2014-05-21 21:22:50

标签: graphviz dot

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

假设:

  • 每个版本都有一个数字,数字越大表示以后的版本。
  • 每个版本必须在图表中的上方早期版本中出现。
  • 每个版本都基于特定的早期版本,不一定是最新版本。
  • 每个"基于"关系显示为从一个节点到另一个节点的箭头。
  • 由于对问题不重要的原因,这些版本的某些子集是分开的。我打电话给他们" alt"版本。 " Alt和#34;发布可以基于非" alt"发布,反之亦然。 (碰巧我对非" alt"版本更感兴趣,但我想要图中的所有版本。)

我可以生成一个清楚地显示版本之间关系的图表,但我也希望将所有" alt"在垂直图的右侧发布,所有非 - " alt"在左侧发布 - 同时保留所有关系信息(这意味着箭头从图的左侧向右移动,反之亦然)。

我试过把" 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

生成的图像文件

demo.png

我想要的是拥有所有" alt"不可见垂直线右侧的节点和左侧的所有其他节点,所有箭头仍然存在(必要时扭曲)。

有没有办法用dot执行此操作?或者是否有其他工具(可在Linux上使用,特别是Debian)可以做同样的事情?

2 个答案:

答案 0 :(得分:2)

这是一个非常晚的答案,但可以帮助其他人。

如果两个节点都属于同一个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;

}

给出

enter image description here

答案 1 :(得分:0)

尝试做类似的事情。将此代码添加到您的代码中:

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;
}

给我: enter image description here

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