我试图用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;
}
Run Code Online (Sandbox Code Playgroud)
直线强制执行:
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];
}
Run Code Online (Sandbox Code Playgroud)
如果将其放入名为 的文件中,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 次 |
| 最近记录: |