我试图用graphviz创建一个树结构.我愿意手工编写graphviz代码或者使用Ruby的ruby-graphviz gem.鉴于以下图片,任何人都可以提供有关必要代码的任何见解吗?忽略线条不直...它们应该是graphviz构建图形时.我也愿意在线条交叉时有点/点.
我玩过ruby-graphviz和家谱类...这让我成为了那里的一部分,但我真的需要所有的线都是直的并且以直角相交,并且开箱即用的代码没有'似乎这样做.
代码应该足够通用,以允许"C"框也有孩子,并且在"A"下也有更多的孩子.
颜色无关......例子可以排除任何颜色.
http://docs.google.com/drawings/pub?id=1lUTfgKP_LN0x7C3ItbsFjfLBuDTL84AtmoaW7YFn32Y&w=1036&h=713
mar*_*pet 12
有点晚了,我知道,但我只想展示另一个版本,而不必弄清楚每个节点的确切位置.
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 - 对样条说不rank=same获得正确的点文件仍然是一些工作,但它可以帮助你计算每个节点的位置.
输出如下:

只要C没有子节点,就必须再应用一些技巧(不可见的节点)将其一直显示到右边.
为了获得不同图形的更通用的解决方案,可能需要进一步调整(对垂直边缘应用权重,或者必须垂直对齐的组节点,或使用子图,......).
据我所知,这需要一些解决方法;我只会用 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。
现在对其工作原理进行一些评论:构建树的代码A, B, C, D, E, Item1, Item2, Item3很简单(属性仅设置颜色和框样式)。使线条笔直且正交的技巧包括 1) 在图表中添加大小为零的不可见节点,以及 2) 将所有对象定位在画布上的绝对坐标中。D1, D2, D3, D4, D5, D6, D7步骤 1) 需要辅助节点,pos="x,y!"步骤 2) 需要选项。请注意,您需要!在命令末尾添加符号pos,否则位置将不会被视为最终位置,并且布局仍会发生更改。
您可以通过以下方式添加其他节点:首先定位一个新节点(通过使用节点的代码A ... Item3作为模板),添加一个不可见的辅助节点(使得pos所有进出该节点的连接都是正交的),然后将该连接添加到图形通过<StartingNode> -- <AuxiliaryNode> -- <NewNode>.
| 归档时间: | 
 | 
| 查看次数: | 5701 次 | 
| 最近记录: |