【问题标题】:complicated graphviz tree structure复杂的graphviz树结构
【发布时间】:2015-06-01 06:32:11
【问题描述】:

我正在尝试使用 graphviz 创建树结构。我愿意手动编写graphviz代码或使用ruby-graphviz gem for ruby​​。鉴于下图,任何人都可以提供有关必要代码的任何见解吗?忽略线条不是直的......它们应该是在graphviz构建图形时。当线条相交时,我也愿意使用点/点。

我玩过 ruby​​-graphviz 和家谱类...这让我在其中的一部分,但我真的需要所有线都是直的并以直角相交并且开箱即用代码似乎没有这样做。

代码应该足够通用,以允许“C”框也有孩子,并且“A”下也有更多孩子。

颜色无关紧要...示例可以排除任何颜色。

http://docs.google.com/drawings/pub?id=1lUTfgKP_LN0x7C3ItbsFjfLBuDTL84AtmoaW7YFn32Y&w=1036&h=713

【问题讨论】:

    标签: ruby graphviz


    【解决方案1】:

    我知道有点晚了,但我只是想展示另一个版本,而不必弄清楚每个节点的确切位置。

    digraph {
        splines=false;
        ranksep=0.05;
    
        node[shape=box, color=lightblue, style=filled];
        A;B;C;D;E;
    
        node[shape=none, color=none, style=solid];
        i1[label="Item 1"];
        i2[label="Item 2"];
        i3[label="Item 3"];
    
        node[label="", width=0, height=0];
        edge[arrowhead=none, color=blue];
    
        {rank=same; n2; n1; n3;}
        n2; n1; n3;
        A -> n1;
        n2 -> n1 -> n3;
    
        {rank=same; B; C;}
        n2 -> B;
        n3 -> C;
    
        {rank=same; n4; D;}
        B -> n4 -> D;
    
        {rank=same; n6; n5; i1;}
        D -> n5 -> i1;
        n4 -> n6;
    
        {rank=same; n7; E;}
        n6 -> n7 -> E;
    
        {rank=same; n8; i2;}
        E -> n8 -> i2;
    
        {rank=same; n9; i3;}
        i2 -> n9 -> i3;
    }
    

    直线被强制执行:

    • splines=false - 对样条曲线说不
    • 不可见节点(节点 n1、n2、... n9)
    • 将节点放置在与rank=same 相同的等级上

    要正确获取点文件仍然需要一些工作,但它胜过恕我直言计算每个节点的位置。

    输出如下所示:

    只要 C 没有子节点,您就必须应用更多技巧(不可见节点)才能将其一直显示到右侧。

    为了为不同的图获得更通用的解决方案,可能需要进行一些进一步的调整(对垂直边应用权重,或者必须垂直对齐的组节点,或者使用子图,...)。

    【讨论】:

    【解决方案2】:

    据我所知,这需要一些解决方法;我只会用 Graphviz DOT 语言来做。我先给你解决方案,然后解释如何扩展它。

    这是结果图:

    这是生成图形的 Graphviz 代码:

    graph atree {
      Item1 [shape=none,label="Item 1",pos="2.2,1.1!"];
      Item2 [shape=none,label="Item 2",pos="2.2,0.1!"];
      Item3 [shape=none,label="Item 3",pos="2.9,-0.3!"];
      A [shape=box,color=lightblue,style=filled,pos="2,3!"];
      B [shape=box,color=lightblue,style=filled,pos="1,2.1!"];
      C [shape=box,color=lightblue,style=filled,pos="3,2.1!"];
      D [shape=box,color=lightblue,style=filled,pos="1.5,1.5!"];
      E [shape=box,color=lightblue,style=filled,pos="1.5,0.5!"];
      D0 [style=invisible,fixedsize=true,width=0,height=0,pos="2,2.5!",label=""];
      D1 [style=invisible,fixedsize=true,width=0,height=0,pos="1,2.5!",label=""];
      D2 [style=invisible,fixedsize=true,width=0,height=0,pos="3,2.5!",label=""];
      D3 [style=invisible,fixedsize=true,width=0,height=0,pos="1,1.5!",label=""];
      D4 [style=invisible,fixedsize=true,width=0,height=0,pos="1,0.5!",label=""];
      D5 [style=invisible,fixedsize=true,width=0,height=0,pos="1.5,1.1!",label=""];
      D6 [style=invisible,fixedsize=true,width=0,height=0,pos="1.5,0.1!",label=""];
      D7 [style=invisible,fixedsize=true,width=0,height=0,pos="2.2,-0.3!",label=""];
      A -- D0 -- D1 -- B -- D3 -- D4 -- E [color=blue];
      E -- D6 -- Item2 -- D7 -- Item3 [color=blue];
      D0 -- D2 -- C [color=blue];
      D3 -- D -- D5 -- Item1 [color=blue];
    }
    

    如果将其放入名为inputfile.dot 的文件中,则可以使用命令neato -Tpng inputfile.dot > outfile.png 获取生成的图像文件。

    现在有几个关于它是如何工作的cmets:使用A, B, C, D, E, Item1, Item2, Item3 构建树的代码很简单(属性仅设置颜色和框样式)。使线条笔直和正交的技巧包括 1) 将大小为零的不可见节点添加到图形中,以及 2) 将所有对象定位在画布上的绝对坐标中。步骤 1) 需要辅助节点 D1, D2, D3, D4, D5, D6, D7,步骤 2) 需要 pos="x,y!" 选项。请注意,您需要在 pos 命令末尾添加 ! 符号,否则位置将不会被视为最终位置,并且布局仍会更改。

    您可以通过首先定位一个新节点(通过使用节点 A ... Item3 的代码作为模板)添加额外的节点,添加一个不可见的辅助节点(使用 pos 以便所有进出它的连接都是正交),然后通过<StartingNode> -- <AuxiliaryNode> -- <NewNode> 将连接添加到图形。

    【讨论】:

    • 所以看起来我的代码将不得不做一些困难的部分来找出绝对定位数字!
    • 不幸的是,我不知道有什么方法可以使用 Graphviz 来绘制节点之间的正交(和拆分)链接!如果您不需要这种行为,Graphviz 将为您完成大部分艰苦的工作。如果你坚持这种行为,恐怕你不得不做一些手工的布局工作。
    • 谢谢。不幸的是,我需要这种行为。我将不得不编写这个逻辑。
    【解决方案3】:

    还有一个使用splines=ortho的版本,它需要更少的隐藏节点并提供类似的视觉效果。

    digraph example {
        splines=ortho;
        ranksep=0.05;
    
        node[shape=box, color=lightblue, style=filled];
        A;B;C;D;E;
    
        node[shape=none, color=none, style=solid];
        i1[label="Item 1"];
        i2[label="Item 2"];
        i3[label="Item 3"];
    
        node[label="", width=0, height=0];
        edge[arrowhead=none, color=blue];
        n1; n2; n3; n4; n5;
    
        {rank=same; B; C;}
        A -> n1;
        n1 -> B;
        n1 -> C;
    
        {rank=same; n2; D;}
        B -> n2;
        n2 -> D;
    
        {rank=same; n3; i1;}
        D -> n3;
        n3 -> i1;
    
        {rank=same; n4; E;}
        n2 -> n4;
        n4 -> E;
    
        {rank=same; n5; i2;}
        E -> n5;
        n5 -> i2;
    
        {rank=same; n6; i3;}
        i2 -> n6;
        n6 -> i3;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2018-12-30
      • 1970-01-01
      相关资源
      最近更新 更多