03.节点图形
DOT
的节点图形分为三类:基于多边形(polygon-based
)的图形,基于record的图形(record-based
)和用户自定义图形(user-defined
)。图形可以由节点的shape
属性决定。
基于多边形的图形
基于多边形的图形可以认为是Graphviz内置的图形,支持的图形列表参见: Polygon-based Nodes
基于record的图形
基于record的图形是指sharp
属性为 record
和 Mrecord
的图形节点,其节点的表现形式由其label
属性决定。 record
和 Mrecord
的区别在于Mrecord
的外围是圆角的。
示例:
digraph structs {
node [shape=record];
struct1 [label="<f0> left|<f1> mid\ dle|<f2> right"];
struct2 [label="<f0> one|<f1> two"];
struct3 [label="hello\nworld |{ b |{c|<here> d|e}| f}| g | h"];
struct1:f1 -> struct2:f0;
struct1:f2 -> struct3:here;
}
label
属性的语法结构如下
field ( '|' field )*
field = fieldId or '{' rlabel '}'
fieldId = [ '<' string '>'] [ string ]
其中
string
值如果包含大括号{}
,尖括号<>
和竖线|
,则需要使用反斜线\
转义。
fieldId为图形增加端口名(portname
),与节点名结合使用时,可以指定Edge与图形结合的位置。
fieldId的第二个字符串用于展示该字段的文本,支持常用的转义序列\n
,\l
和\r
。
在括号 {}
中嵌套的内容,在水平和垂直布局之间进行翻转。
节点的初始布局方向取决于图形的rankdir
属性。如果此属性是TB
(默认值)或BT
(对应于垂直布局),如果此属性是LR
或RL
(对应于水平布局),
graph [rankdir=LR]
类HTML的label
如果一个节点的label
(节点,Edge,cluster,图形的 label
或者Edge的 headlabel
和 taillabel
)不是以"..."
界定,而是以<...>
界定时,标签将做为类HTML被解析(这些标签并不是真正的HTML)。
如果节点的shape
属性设置为none
或plaintext
,则解析后的图形就做为该节点的图形。如果节点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;
}
在上面的示例中,通过
td
的port
为图形打开了端口名(portname
)
更复杂的设计参见: HTML-Like Labels
用户自定义图形(user-defined
)
用户自定义图形取决于具体图形的细节,目前,形状可以使用PostScript描述。详细内容参见: How can I create custom shapes