Basic Graph Drawing
dot 绘制定向图形。它读取属性化的图文本文件并描绘成图像, 作为图形文件或图形格式文件,如 GIF、PNG、SVG、PDF 或 PostScript。
dot 通过四种主要步骤画图。了解这一点有助于您了解 dot 布局类型以及如何控制它们。dot 使用的布局过程依赖于图形是循环的(acyclic)。因此,第一步是通过反转某些循环边的内部方向来打破输入图中出现的任何循环。下一步将节点(nodes)分配给离散等级(ranks)或级别(levels)。在从上到下的图形中,排名(rank)确定 Y 坐标。跨越多个排名(rank)的边被分解为"虚拟"节点(virtual nodes)和单位长度边的链。第三步在层级种安排节点以避免交叉。第四步将节点的 X 坐标设置以保持边短,最后一步路由边样线(edge splines)。这是相同的一般方法,大多数分层图形绘制程序,基于 Warfield,Carpano 和 Sugiyama 的工作。我们将读者推荐给 GKNV93,以便对 dot 算法有深入的了解。
dot 接受 DOT 语言的输入(参见附录 D)。此语言描述了三种主要对象类型:图形(graphs)、节点(nodes)和边(edges)。主(最外层)图形可以是有向图或无方向图形。由于 dot 使定向图形的布局,因此以下所有示例都使用图。(单独的布局实用程序 neato 绘制非定向图形 [Nor92]。在主图形中,子图定义节点和边的子集。
图 1 是 DOT 语言中的示例图。第 1 行提供图形名称和类型。后续的行创建节点、边或子图,并设置属性。所有这些对象的名称可以是 C 标识符、数字或引用的 C 字符串。引号保护标点符号和空白。
当节点的名称首次出现在文件中时,将创建节点。当边运算符 -> 加入节点时,将创建边。在此示例中,第 2 行从 main 到 parse,从 parse 到 execute。用命令 dot 执行这个文件(将其称为 graph1.gv)产生图 2 的图形。命令行选项 -Tps 选择 PostScript(EPSF)输出。graph1.ps可以打印、由 PostScript 查看器显示或嵌入到其他文档中。
dot -Tps graph1.gv -o graph1.ps
调整布局中节点和边的表示或位置通常很有用。这是通过在输入文件。属性是字符串的名称值对。图 3 和图 4 说明了一些布局属性。在图 3 的列表中,第 2 行将图形的大小设置为 4,4(以英寸为单位)。此属性控制绘图的大小;但是,此属性控制图形的大小。如果绘图太大,则根据需要均匀缩放以适合。
节点或边属性以方括号设置。在第 3 行中,节点主分配形状框。第 4 行的边缘通过增加其权重(默认值为 1)来拉直。第 6 行的边缘以虚线绘制。第 8 行从执行边制作字符串和 printf。在第 10 行中,默认边缘颜色设置为红色。这会影响在文件中的此点之后创建的任何边。第 11 行使粗体边缘标记为 100 次。在第 12 行中,节点make_string
多行标签。第 13 行将默认节点更改为一个填充蓝色阴影的框。节点比较继承这些值。
digraph G {
size = "4,4";
main [shape=box];
main -> parse [weight=8];
parse -> execute;
main -> init [style=dotted];
main -> cleanup;
execute -> {make_string; printf};
init -> make_string;
edge [color=red];
main -> prinf [style=bold, label= "100 times"];
make_string [label = "make a \nstring"];
node [shape=box,style=filled,color=".7 .3 1.0"];
execute -> compare;
}
2 Drawing Attributes
附录A,B 和 C 中总结了影响图形会值的主要属性。关于更多的属性,和属性更完整的描述,你可以参考Graphviz 网站
www.graphviz.org/doc/info/attrs.html
2.1 Node Shapes
默认情况下,节点绘制的 shape=ellipse, width=.75, height=.5, 并由节点名称标记。其他常见形状包括框(box)、圆圈(circle)、记录(record)和纯文本(plaintext)。在附录 H 中给出了主节点形状的列表。 节点形状纯文本特别令人感兴趣,因为它绘制的节点没有任何轮廓,这是某些图表中的重要约定。在图形结构是主要关注的情况下,特别是当图形是中等的 点形状较大,可减小节点以显示最小内容。绘制时,节点的实际大小是请求的大小及其文本标签所需的区域的较大,除非为 fixedsize=true,在这种情况下,将强制执行宽度和高度值。
节点形状分为两大类:基于面(polygon-based)和基于记录(record-based)。除 record 和 Mrecord 之外的所有节点形状都被视为多边形,并且按边数(椭圆和圆形为特殊情况)进行建模,以及其他几个几何属性。其中一些属性可以在图形中指定。如果为 regular=true,则节点将强制为常规节点。参数 peripheries 设置绘制的边界曲线数。例如,双圆具有 peripheries=2。方向属性指定以度为单位的多边形顺时针旋转。
形状多边形(polygon)公开所有多边形参数,可用于创建许多未预定义的形状。除了上面提到的参数 常规(regular)、外围(peripheries)和方向(orientation)外,多边形还按边数(sides)、偏斜(skew)和失真(distortion)进行参数化。偏斜是浮动的点数(通常在 +1.0 和 1.0 之间),通过从上到下倾斜形状来扭曲形状,正值将多边形的顶部向右移动。因此,倾斜可用于将框转换为平行四边形。失真将多边形从上到下缩小,负值导致底部大于顶部。变形将盒子变成梯形。图 6 和图 5 显示了各种多边形属性。
基于记录的节点构成其他类的节点形状。其中包括形状记录和 Mrecord。两者是相同的,除了后者有圆角。这些节点表示递归字段列表,这些字段绘制为交替的水平和垂直行的框。递归结构为由节点的标签确定,该标签具有以下架构:
rlabel -> field('|' field)*
field -> boxLabel| "rlabel"
boxLabel -> ['<' string '>'][string]
必须转义文字大括号、垂直条和角括号。空格被解释为令牌之间的分隔符,因此,如果要在文本中字面显示空格,则必须转义它们。boxLabel 中的第一个字符串为字段指定名称,并用作框的端口名称(参见第 3.1 节)。第二个字符串用作字段的标签;它可能包含与多行标签相同的转义序列(参见第2.2节)。图 7 和图 8 的示例说明了记录的使用和某些属性。
2.2 Labels
如上所述,默认节点标签是其名称。默认情况下,边缘未标记。可以使用标签属性显式设置节点和边标签,如图 4 所示。
尽管按名称标记节点可能很方便,但在有些时候必须显式设置标签(labels)。例如,在绘制文件目录树时,一个目录可能有多个名为 src 的目录,但每个目录都必须具有唯一的节点标识符。
digraph G {
a -> b -> c;
b -> d;
a [shape=polygon, sides=5, peripheries=3, color=lightblue, style=filled];
c [shape=polygon, sides=4, skew=.4, label="hello world"]
d [shape=invtriangle];
e [shape=polygon, sides=4, distrotion=.7];
}
digraph structs {acyclic
node [shape=record];
struct1 [shape=record, label="<f0> left|<f1> mid\ndle|<f2> right"];
struct2 [shape=record, label="<f0> one|<f1> two"];
struct3 [shape=record, label="hello\nworld |{ b |{c|<here> d|e}| f}| g | h"];
struct1 -> struct2;
struct1 -> struct3;
}
inode 编号或完整路径名称是合适的唯一标识符。然后每个节点(node)的标签(label)可以设置为其目录中的文件名。
可以使用转义序列 \n, \l, \r 来终止居中或左或右对齐的行,从而创建多行标签。
图形和聚类子图也可能具有标签。默认情况下,图形标注位于图形下方。设置标签 loc=t 将标签居于图形上方。群集标签显示在右上角的封闭矩形内角落。值 labelloc=b 将标签移动到矩形的底部。设置标签 just=r 将标签向右移动。
默认字体为 14-point Times-Roman, black。可以使用属性字体名称(fontname)、字体大小(fontsize )和字体颜色(fontcolor)选择其他字体系列(font families)、大小(sizes)和颜色(colors)。字体名称应与目标解释器兼容。最好只使用标准字体系列 Times、Helvetica、Courier 或 Symbol,因为这些字体保证与任何目标图形语言配合使用。例如,Times-Italic、Times-Italic 和 Times-Bold 是便携式的;AvanteGardeDemiOblique 不是。
对于位图(bitmap)输出(如 GIF 或 JPG),点依赖于在布局期间提供这些字体。Grap