【问题标题】:How to assign the same style to a group of edges?如何为一组边缘分配相同的样式?
【发布时间】:2019-04-14 23:44:30
【问题描述】:

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

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

【问题讨论】:

    标签: coding-style grouping stylesheet graph-theory graphviz


    【解决方案1】:

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

    像这样:

    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 实践

    【讨论】:

    • 如何设置子图的默认样式?
    • 不需要子图。在带有“edge [color=...etc]”的边缘样式声明下定义的所有边缘都将使用该样式。
    【解决方案2】:

    虽然@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 
    

    【讨论】:

    • 完美,简直完美。
    • 为什么更好?并不是要批评你。我对graphviz的了解还不够,无法理解它是如何更好的,我有兴趣了解一下。
    • 我只是喜欢结果图。解决的原理没有什么不同。
    【解决方案3】:

    正如@bousch subgraph 所指出的,不需要。

    “在带有“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 做同样的事情。

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 2017-06-03
      • 1970-01-01
      • 2022-09-23
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多