【问题标题】:How do I order subgraph clusters when using dot?使用点时如何订购子图簇?
【发布时间】:2018-01-27 09:07:15
【问题描述】:

我有一个点文件,我在其中创建了我希望以特定顺序出现的子图集群,假设我有这个:

digraph G {
    splines=true;
    sep="+25,25";
    overlap=scalexy;
    nodesep=0.6;
    subgraph cluster_2 {
        label="ADD_MORE_PROBLEMS";
        subgraph cluster_3 {
            label="pattern";
            N1 [label="problem"];
        }
        subgraph cluster_4 {
            label="replacement";
            N2 [label="problem"];
            N3 [label="problem"];
        }
    }
}

创建:

如何确保“模式”出现在“替换”的左侧(我可能有任意数量的子图)。

【问题讨论】:

  • 只是澄清一下,在文件中有几个顶级集群,实际上这些集群确实像预期的那样从左到右显示。
  • 颠倒内部集群的顺序似乎可以得到您想要的数字。更一般地说,似乎子图首先出现在代码中的右向左。
  • 谢谢。最终,我还想要嵌套子图,事情开始失控。我最终渲染了每个子图,然后以正确的顺序合成了各个图像。

标签: graphviz dot


【解决方案1】:

集群是一种奇怪的情况,代码中的简单排序会产生大部分(如果不是全部)差异。如果我们只是像这样重新排序您的代码:

digraph G {
    splines=true;
    sep="+25,25";
    overlap=scalexy;
    nodesep=0.6;
    subgraph cluster_2 {
        label="ADD_MORE_PROBLEMS";
        subgraph cluster_4 {
            label="replacement";
            N2 [label="problem"];
            N3 [label="problem"];
        }
        subgraph cluster_3 {
            label="pattern";
            N1 [label="problem"];
        }
    }
}

这一切都不同。

现在,这可能会失败,在这种情况下,设置不可见边缘是更常见的解决方案之一。

【讨论】:

    【解决方案2】:

    我不能给出和回答,但可以提供一些澄清。强制布局的常用方法是引入隐藏边缘。在这种情况下,它不起作用。

    如果没有嵌套集群,您可以使用rank=same 将连接的边强制到同一级别。然后,一个不可见的边缘N1 -> N2 [style = invis] 将强制节点进入正确的顺序。

    但是,用等级约束节点会破坏集群成员资格并阻止方案工作。

    修改后的图表显示了结果。可能没有通用的解决方案。

    digraph G {
        splines=true;
        sep="+25,25";
        overlap=scalexy;
        nodesep=0.6;
        subgraph cluster_2 {
            label="ADD_MORE_PROBLEMS";
            subgraph cluster_3 {
                label="pattern";
                N1 [label="problem 1"];
            }
            subgraph cluster_4 {
                label="replacement";
                N2 [label="problem 2"];
                N3 [label="problem 3"];
            }
            // Introduce hidden edge (shown dashed)
            N1 -> N2 [style = dashed];
            // Force nodes to remain at same rank
            { rank = same; N1; N2; }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 2021-07-17
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      相关资源
      最近更新 更多