代码之家  ›  专栏  ›  技术社区  ›  kdb

嵌套的graphviz树?

  •  0
  • kdb  · 技术社区  · 6 年前

    tl;dr:在graphviz中是否有一些创建树的简短符号,不需要重新键入节点名?

    我想用格拉夫维兹的思维导图 twopi 工具。为了避免反复重写相同的标签(或者使用模糊的速记),我尝试使用嵌套的大括号。

    基本上,我期望这里的两个子图具有相同的结构:

    digraph example {            
            subgraph AA {     
                    root -> {a b c}
                    a -> {a1 a2 a3}
                    b -> {b1 b2 b3}
                    c -> {c1 c2 c3}
            }
            subgraph XX {
                    _root -> {
                            _a -> { _a1 _a2 _a3 }
                            _b -> { _b1 _b2 _b3 }
                            _c -> { _c1 _c2 _c3 }
                    }
            }
    }
    

    但是,第一个具有我想要的层次结构,而第二个具有来自根节点的意外连接。编译时使用 twopi -Tpng example.dot -o example.png :

    enter image description here

    第一个表单可以使用如此短的符号名,但是当标签包含实际文本时,文本文件很快就会变得难以读取。

    第二种形式会有所帮助,但很明显我理解graphviz中分组的效果。

    是否有一些语法,可以避免在尝试时重复节点名 subgraph XX ?

    1 回复  |  直到 6 年前
        1
  •  1
  •   magjac    6 年前

    我很肯定没有。从 https://www.graphviz.org/doc/info/lang.html :

    Edge语句允许在Edge运算符的左侧和右侧都有子图。发生这种情况时,将从左侧的每个节点到右侧的每个节点创建一条边。

    这意味着你必须重复 某物 为了不让树枝(包括树根)的边缘 一切 在那个分支上。我通常使用重复最容易编写的节点。

    我不认为这会让你更快乐,但是这里有一个方法,只重复根节点:

    <!DOCTYPE html>
    <meta charset="utf-8">
    <body>
    <script src="https://d3js.org/d3.v5.js"></script>
    <script src="https://unpkg.com/viz.js@1.8.2/viz.js" type="javascript/worker"></script>
    <script src="https://unpkg.com/d3-graphviz@2.4.2/build/d3-graphviz.js"></script>
    <div id="graph" style="text-align: center;"></div>
    <script>
    
    var dotSrc = `
    digraph example {            
        subgraph AA {     
            root -> {a b c}
            a -> {a1 a2 a3}
            b -> {b1 b2 b3}
            c -> {c1 c2 c3}
        }
        subgraph XX {
            _root -> _a -> { _a1 _a2 _a3 }
            _root -> _b -> { _b1 _b2 _b3 }
            _root -> _c -> { _c1 _c2 _c3 }
        }
    }
    `;
    
    d3.select("#graph").graphviz()
      .engine("twopi")
      .renderDot(dotSrc);
    
    </script>