20130406

用graphviz画机房拓扑的几个关键词

用graphviz画机房拓扑的几个关键词

我准备用graphviz画机房的拓扑图。用excel或txt记录机器和VLAN什么的信息,用antlr写个工具解析,然后生成dot文件,最后用graphviz把dot画出来。

想到有这么几个基本技术,今天试了一下。下面的这段代码就是例子。行号是我加的,为了说明方便。执行结果如图所示。

建一同学提到用graphviz画UML,请参考 plantuml。不知道为什么被墙了。

1 // dot -Tpng test.dot -o test.png; eog test.png
2 digraph a
3 {
4     node1 [label="NODE1", shape=none, image="pc.png", labelloc=b]; // color=white,
5     node2 [shape=box3d];
6     node3;
7     node4;
8
9 //    edge [weight=100, arrowhead=none];
10     node1 -> node2 [taillabel="tail", headlabel="head", labeldistance=3, labelangle=-45 ,label="label", sametail="a"];
11 //    edge [weight=0.5, arrowhead=none];
12     node1 -> node3:se [sametail="a", weight=100];
13     node3 -> node4;
14    
15     {rank = same; node2; node4; };
16    
17    
18 }

1. 定制节点

默认的节点是矩形圆形多边形这样规则的形状。可以使用图片,人类看起来漂亮一些。

参见第4行,image="pc.png"。

2. 线连接的位置

有些节点要连出去很多线,线连接的位置如果散开,有时候比较难看。sametail可以让它们都聚在一起,参见第10和第11行。

也许,有时候想从特别的角度连到节点上,可以指定方向,参见第12行node3:se,表示从东南方向连接。

3. 题注的位置

用了定制的图片以后,题注标在节点正中就有些不合习惯,可以用labelloc指定位置。参见第4行,lableloc=b,b表示底部。

线的题注 (这东西叫题注么?) 除了label本身以外,可以用taillabel,headlabel,分别标在箭尾或箭头。标在箭尾或箭头的题注,可以用labeldistance=3, labelangle=-45进一步修订,参见第10行。

4. 节点的位置

某个节点,如果希望它跟别的节点平级,用rank,参见第15行。rank不仅能same,还可以起名字。这一技术还可以用于水平的图,让时间与事件对齐。

还可以用node的属性pos指定节点位置。实验表明,1.需要给出所有的node的位置,2.要使用neato引擎,不能用dot本身。而且,我在实验中发现,想指定一个合理美观的节点位置实在太难了。如果想强调某个结点的核心位置,请参见下一条。

5. 连线的位置

如果想强调某根线,用weight。weight越大,线越直,线连接的节点间距离越近。参见第9、11、12行。

weight是edge的属性,因此既可以加在某条线的后的"[]"里,也可以如第9行的写法,从此向下的edge都具有这样的属性。


更多细节,请参考[http://www.graphviz.org/doc/info/attrs.html]。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

No comments: