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

问题描述 投票:22回答:3

我有一个图表,我想要graphviz布局和可视化我。该图有122个边和123个节点。边缘有4种不同的类型,我希望它们在视觉上可以区分。但是我还没有决定最好的方法是什么,我想稍微调整一下表盘。

不幸的是,我没有看到像边缘的“类”或“样式表”属性。我只能为每个边缘(大量重复)单独设置视觉属性。也许我错过了什么?毕竟可能有一些方法可以将边添加到4个不同的组然后设置组的样式,而不是单独的每个边?

coding-style grouping stylesheet graph-theory graphviz
3个回答
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];}

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

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

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

子图通常用于在视觉上突出显示节点集群(即,将特定的连续“组”节点与图中的其余节点区分开);但是,没有要求(正如你从我的例子中看到的那样)你选择通过赋值给一个给定子图进行样式化的边缘属于一个连续的“节点组” - 你可以指定你希望赋值的任何边。给定的子图。)

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


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

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


1
投票

正如@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一样。

© www.soinside.com 2019 - 2024. All rights reserved.