03.节点图形

DOT的节点图形分为三类:基于多边形(polygon-based)的图形,基于record的图形(record-based)和用户自定义图形(user-defined)。图形可以由节点的shape属性决定。

基于多边形的图形

基于多边形的图形可以认为是Graphviz内置的图形,支持的图形列表参见: Polygon-based Nodes

基于record的图形

基于record的图形是指sharp属性为 recordMrecord 的图形节点,其节点的表现形式由其label属性决定。 recordMrecord 的区别在于Mrecord的外围是圆角的。

示例:

digraph structs {
    node [shape=record];
    struct1 [label="<f0> left|<f1> mid&#92; dle|<f2> right"];
    struct2 [label="<f0> one|<f1> two"];
    struct3 [label="hello&#92;nworld |{ b |{c|<here> d|e}| f}| g | h"];
    struct1:f1 -> struct2:f0;
    struct1:f2 -> struct3:here;
}

001

label属性的语法结构如下

field ( '|' field )*
field	=	fieldId or '{' rlabel '}'
fieldId	=	[ '<' string '>'] [ string ]

其中string值如果包含大括号{},尖括号<>和竖线|,则需要使用反斜线\转义。

fieldId为图形增加端口名(portname),与节点名结合使用时,可以指定Edge与图形结合的位置。
fieldId的第二个字符串用于展示该字段的文本,支持常用的转义序列\n\l\r

在括号 {} 中嵌套的内容,在水平和垂直布局之间进行翻转。

节点的初始布局方向取决于图形的rankdir属性。如果此属性是TB(默认值)或BT(对应于垂直布局),如果此属性是LRRL(对应于水平布局),

graph [rankdir=LR]

002

类HTML的label

如果一个节点的label(节点,Edge,cluster,图形的 label 或者Edge的 headlabeltaillabel )不是以"..."界定,而是以<...>界定时,标签将做为类HTML被解析(这些标签并不是真正的HTML)。
如果节点的shape属性设置为noneplaintext,则解析后的图形就做为该节点的图形。如果节点shape属性设置为其它形状(point除外),则解析后的图形做为普通标签嵌入节点中。

label做为类HTML标签时 " , & , < , >需要使用转义字符序列来表示。

基label的语法如下:

label 	: 	text
	| 	fonttable
text 	: 	textitem
	| 	text textitem
textitem 	: 	string
	| 	<BR/>
	| 	<FONT> text </FONT>
	| 	<I> text </I>
	| 	<B> text </B>
	| 	<U> text </U>
	| 	<O> text </O>
	| 	<SUB> text </SUB>
	| 	<SUP> text </SUP>
	| 	<S> text </S>
fonttable 	: 	table
	| 	<FONT> table </FONT>
	| 	<I> table </I>
	| 	<B> table </B>
	| 	<U> table </U>
	| 	<O> table </O>
table 	: 	<TABLE> rows </TABLE>
rows 	: 	row
	| 	rows row
	| 	rows <HR/> row
row 	: 	<TR> cells </TR>
cells 	: 	cell
	| 	cells cell
	| 	cells <VR/> cell
cell 	: 	<TD> label </TD>
	| 	<TD> <IMG/> </TD>

示例

digraph structs {
    node [shape=plaintext]
	
    struct1 [label=<
<table border="0" cellborder="1" cellspacing="0">
  <tr><td>a</td><td port="b">b</td><td port="c">c</td></tr>
</table>>];

    struct2 [label=<
<table border="0" cellborder="1" cellspacing="0">
  <tr><td port="d">d</td><td>e</td></tr>
</table>>];

    struct3 [label=<
<table border="0" cellborder="1" cellspacing="0" cellpadding="4">
  <tr>
    <td rowspan="2">hello<br/>world</td>
  </tr>
  <tr>
    <td>c</td><td port="here">d</td><td>e</td>
  </tr>
  <tr>
    <td colspan="3">f</td>
  </tr>
</table>>];
    struct1:b -> struct2:d;
    struct1:c -> struct3:here;
}

003

在上面的示例中,通过tdport为图形打开了端口名(portname)

更复杂的设计参见: HTML-Like Labels

用户自定义图形(user-defined)

用户自定义图形取决于具体图形的细节,目前,形状可以使用PostScript描述。详细内容参见: How can I create custom shapes