我可以同时将样式应用于从多个子图中获取的许多DOT节点吗?

时间:2015-02-08 14:29:23

标签: graphviz dot

考虑这个DOT样本:

digraph Foo
{
    subgraph clusterA
    {
        A -> B;
    }

    subgraph clusterB
    {
        X -> Y;
    }

    subgraph connection_type_1
    {
        edge [color=red];
        A -> Y;
    }

    subgraph connection_type_1
    {
        edge [color=green];
        B -> X;
    }

    subgraph node_type_1
    {
        node [style=filled, color=".5,.5,.5"]; // THIS LINE DOESN'T WORK
        X [label="foo"];
        A;
    }
}

结构在两个簇中列出,稍后在语义/美容等效组中添加边。边缘按预期着色。

但这不适用于样式节点。标记的行无效,除非我将其移动到cluster*子图中的一个,但它适用于该子图中的所有节点。

奇怪的是label=foo在最终子图中起作用,而style则不起作用。

我有一种感觉,答案是“你只能在第一次提到它们时设置节点属性”,但是有没有办法说“以下节点,无论它们在哪里,都应该有以下节点属性“?

1 个答案:

答案 0 :(得分:4)

该行不起作用,因为它仅设置默认属性并且已经创建了节点。默认属性无效。标签是覆盖任何默认值的具体属性,因此生效。

所以你应该把代码重新排序到

  1. 创建所有节点(使用默认属性)
  2. 创建所有边(再次使用默认属性)
  3. 将节点分配给群集
  4. 步骤2和3将创建具有默认属性然后激活的节点。你的例子只是偶然地为边缘工作,因为你只尝试了非现有边缘。它不会对集群中已经定义的2个边缘起作用。

    digraph Foo {
        subgraph node_type_1 {
            node [style=filled, color=".5,.5,.5"];
            A;
            X [label="foo"];
        }
        subgraph node_type_2 {
            node [style=none];
            B;
            Y;
        }
        subgraph connection_type_1 {
            edge [color=red];
            A -> Y;
            A -> B;
        }
        subgraph connection_type_2 {
            edge [color=green];
            B -> X;
            X -> Y;
        }
        subgraph clusterA {
           A;
           B;   
        }
        subgraph clusterB {
            X;
            Y;
        }
    }