Graphviz:如何为一组边分配相同的样式?

Vil*_*lx- 23 grouping coding-style graph-theory stylesheet graphviz

我有一个图表,我想要graphviz布局和可视化我.该图有122个边和123个节点.边缘有4种不同的类型,我希望它们在视觉上可以区分.但是我还没有决定最好的方法是什么,我想稍微调整一下表盘.不幸的是,我没有看到像边缘的"类"或"样式表"属性.我只能为每个边缘(大量重复)单独设置视觉属性.也许我错过了什么?毕竟可能有一些方法可以将边添加到4个不同的组然后设置组的样式,而不是单独的每个边?

dou*_*oug 33

要按而不是单独设置边(或节点)样式,请使用子图.

像这样:

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];}
Run Code Online (Sandbox Code Playgroud)

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

一种类型只是默认值(颜色=黑色,厚度= 1等) - 即,这些边缘未分配给子图.

另外两种类型的边缘(薄的,深绿色的组和厚的亮黄色的组)基于对两个子图簇之一的赋值来设置样式.

子图通常用于在视觉上突出显示节点集群(即,将特定的连续"组"节点与图中其余节点区分开来); 然而,没有要求(你可以从我的例子中看到的),您选择的风格通过转让给定的子图的边缘,属于节点的连续"组" -你可以指定你想用于分配给任何边缘给定的子图.)

对我来说,按组划分样式节点类似于定义类并将其分配给HTML标记中的div集合的HTML实践

  • 不需要子图.在边缘样式声明下面定义的所有边缘都使用"edge [color = ... etc]"将使用该样式. (3认同)

buk*_*zor 12

虽然@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;
  }
}
Run Code Online (Sandbox Code Playgroud)


cat square-digraph.dot | dot -Tsvg -o square-digraph.svg 
Run Code Online (Sandbox Code Playgroud)

结果图