如何将同样的样式分配给一组边?

27
我有一个图表想让graphviz为我布局和可视化。该图表有122条边和123个节点。这些边分为4种不同类型,我希望它们在视觉上能够区分开来。但是我还没有决定最好的方法是什么,我想调整一下参数再看看效果。
不幸的是,我没有看到类似于“class”或“stylesheet”属性的东西适用于边。我只能为每条边单独设置视觉属性(需要大量重复)。也许我错过了些什么?是否有一些方法可以将边添加到4个不同的组中,然后对组进行样式设置,而不是每个边都单独设置呢?
3个回答

36

要按组别而不是单独地设置边缘(或节点)的样式,请使用 subgraph

像这样:

digraph G {

node [style=filled,color="#5D8AA8", fillcolor="#5D8AA8"];

subgraph c1 {
    edge [color="#004225", arrowsize="0.6", penwidth="1"];
    "node 1" -> "node 3";
    "node 5" -> "node 7";
    "node 1" -> "node 2"; 
    label = "";
}

subgraph c2 {
    edge [color="#FBEC5D", arrowsize="1.2", penwidth="3"];
    "node 2" -> "node 4";
    "node 4" -> "node 6";
    "node 3" -> "node 5";
    "node 6" -> "node 8"; 
    label = "";

}

begin -> "node 1";
start -> "node 2";
"node 1" -> "node 4"
"node 2" -> "node 6";

start [shape=diamond];}

如果您将上面的代码放入一个扩展名为".dot"的文件中,然后在graphviz中渲染它,你会看到三种不同类型的边缘,外观方面。

一种类型是默认值(颜色=黑色,厚度= 1等)--即这些边缘没有分配给任何子图。

另外两种类型的边缘(一组细的、深绿色和一组粗的、明黄色)是根据分配给两个子图集合而进行样式设置的。

子图通常用于在视觉上突出显示节点集群(即区分图形中特定的连续“组”与图形中其余节点); 然而,没有要求(如您从我的示例中所看到的那样),您选择进行样式设置的边缘属于相邻的“组”节点——可以指定任何您想要分配给给定子图的边缘)。

对我来说,通过组对节点进行样式设置类似于在HTML标记中定义类并将其分配给一组div的做法。


我们如何为子图设置默认样式? - Pacerier
3
不需要子图。在使用“edge [color=...等]”声明的边样式之下定义的所有边都将使用该样式。 - bousch

14

虽然 @doug 的回答是正确的(使用子图来将相似风格分配给一组对象),但我认为我的例子更好:

digraph G {                                                                     
  compound=true;
  subgraph columns {
    c0r0 -> c0r1;
    c0r1 -> c0r2;
    c1r0 -> c1r1;
    c1r1 -> c1r2;
    c2r0 -> c2r1;
    c2r1 -> c2r2;
  }
  subgraph rows {
    edge [color=red, constraint=false];
    c0r0 -> c1r0;
    c1r0 -> c2r0;
    c0r1 -> c1r1;
    c1r1 -> c2r1;
    c0r2 -> c1r2;
    c1r2 -> c2r2;
  }
}


->


cat square-digraph.dot | dot -Tsvg -o square-digraph.svg 

生成的图形


1
完美,非常完美。 - Pacerier
1
为什么它更好呢?并不是要批评你。我不太了解graphviz,无法理解它的优势,但我很想了解。 - Leo Ufimtsev
我只是喜欢最终的图表。解决方案的原则并没有不同。 - bukzor

3
作为@bousch指出的那样,子图是不必要的。
“在具有“edge [color=...etc]”的边样式声明下定义的所有边都将使用该样式。”

digraph G {                                                                     
  compound=true;
  
    c0r0 -> c0r1;
    c0r1 -> c0r2;
    c1r0 -> c1r1;
    c1r1 -> c1r2;
    c2r0 -> c2r1;
    c2r1 -> c2r2;
  
    edge [color=red, constraint=false];
    c0r0 -> c1r0;
    c1r0 -> c2r0;
    c0r1 -> c1r1;
    c1r1 -> c2r1;
    c0r2 -> c1r2;
    c1r2 -> c2r2;
  
}

将执行与@bukzor相同的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接