用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]