1、graphviz特点

  • 安装: sudo apt install graphviz
  • 文档:点击
  • Graphviz是开源的图形可视化软件。 图形可视化是一种将结构信息表示为抽象图形和网络图的方式。 它在网络,生物信息学,软件工程,数据库和网页设计,机器学习以及其他技术领域的可视界面中具有重要的应用。
  • Graphviz布局程序以简单的文本语言获取图形描述,并以有用的格式制作图表,例如用于网页的图像和SVG; PDF或Postscript包含在其他文档中; 或在交互式图形浏览器中显示。 Graphviz具有用于具体图表的许多有用功能,例如颜色,字体,表格节点布局,线条样式,超链接和自定义形状的选项。
  • graphviz是一个开源软件包,dot和gvedit等工具都在该软件包中
    所以,不妨简单的认为DOT是一门图形描述语言而graphviz是处理该语言文件的一个集成化的工具。

1.1 graphviz 工具

DOT

  • 有向图的“分层”或分层图。 如果边缘具有方向性,这是默认使用的工具。
  • DOT是一种文本图形描述语言。DOT语言文件通常具有.gv或是.dot的文件扩展名。当然,在编写好.dot或者.gv的文件之后,需要有专门的程序处理这些文件并将其渲染成为图片,dot就是其中一款程序,它可以将DOT语言描述的图形渲染成.png、.jpg、.pdf等多种类型。
  • 当然,作为工具,dot本身是很原始的,就像gcc之于c代码,g++之于cpp代码一样,或许某些程序员会热衷于在终端使用这些工具,但也有很多人喜欢交互式的界面,所以就有了gvedit之类的工具,它提供交互式的窗口来使用dot等工具渲染DOT语言描述的图形。

neato “弹簧模型”布局。 如果图形不是太大(大约100个节点),并且您对此一无所知,这是默认使用的工具。 Neato尝试最小化全局能量函数,这等效于统计多维缩放。

fdp “弹簧模型”布局类似于neato的布局,但这是通过减小力而不是消耗能量来实现的。
sfdp -fdp的多比例版本,用于大图的布局。
twopi-Graham Wills 97之后的径向布局。根据与给定根节点的距离,将节点放置在同心圆上。
circo -圆形布局,在Six and Tollis 99,Kauffman和Wiese 02之后。这适用于多个循环结构的某些图,例如某些电信网络。

1. 文档

具体的帮助文档:点击

2、dot

  • 文档:dot 文档:点击
    可直接下载pdf文档查看。
  • 执行:dot -Tpng test.dot -o test.png

2.1 基本语法

  • , graph(无向图)或者digraph(无向图)表示图,然后{}中的内容是对图的描述,注释风格和C类似(“//”用于单行注释,/**/用于多行注释)。
    属性设置:在一个图的开头写入属性即可设置图形的属性,常用的图形属性有size、label、labelloc、labeljust、bgcolor、rankdir等。
    子图,可以进行和“父图”类似的设置,唯一注意的是子图必须以”cluster”做为名称的开始。
  • 节点,DOT中,节点可以不用声明直接使用。每个节点首次出现的名称做为该节点的唯一标识。
    属性设置:对节点可以设置的常见通用属性有shape、label、style、color、fillcolor、rank等,对于不同的形状,可能还有不同的属性可以设置,如对于多边形可以设置边数等。节点属性设置时,node用于设置默认属性(对设置位置之后的点有效),在点后面用[]设置单独一个点的属性。
  • ,边有有向边和无向边两种,无向边用于无向图,有向边用于有向图,不可混用。
    属性设置:边的常见设置有style、color、weight、label、labelfontcolor、headlabel、taillabel、decorate等,对于有向边,还可以设置边的起点位置等(用n、e、s、w和相邻字母的组合表示位置)。和节点类似的,边属性设置时,用edge[]设置默认属性,在边之后用[]设置单独一条边的属性。

DOT的语法非常简单,。具体的属性等可以参见官网的Document

2.2 案例

案例1

digraph line_extract {

    labelloc = t            // 标签垂直顶部
    labeljust = c           // 标签水平居中
	fontsize = 24           // 字体大小
    fontcolor = black       // 字体颜色
    fontname="Futura"       // 字体

    label = "laser_v_extract"

	start [shape=hexagon,color=blue,label="start"];


	subgraph cluster0 {
		label = "extract";
		extract_line -> FilterSuitLine;
		FilterSuitLine -> GetProVMark;
		color=blue
	}
	
	subgraph cluster1 {
		label = "matcher";
		MakeSureMarkV -> marks;
		color=blue
	}
	start->extract_line [color=red];
	marks->end [color=red];


	explian_extract [ shape=plaintext, label="line region growing"];
	explian_extract -> extract_line :e[style=dotted,arrowhead="normal",constraint=false];

	explian_filter [ shape=plaintext, label="line len"];
	explian_filter -> FilterSuitLine:e [style=dotted,constraint=true];

	explian_markv [ shape=plaintext, label="select V"];
	explian_markv -> GetProVMark:e [style=dotted,constraint=true];

	explian_surev [ shape=plaintext, label="point_to_line\n ceres"];
	explian_surev -> MakeSureMarkV :e [style=dotted,constraint=true];

	GetProVMark -> MakeSureMarkV [color=red,len=20,constraint=true];

	end [shape=hexagon,color=blue,label="end"];
}

效果图:
line_extract

案例2

digraph structs {
    labelloc = t            // 标签垂直顶部
    labeljust = c           // 标签水平居中
	fontsize = 24           // 字体大小
    fontcolor = black       // 字体颜色
    fontname="Futura"       // 字体
    label = "relcoator_interface"
	
	relocator_module [shape=record,label="{relative_locator| { relative_thread | { {extrack |match}  |{union_opt} } | ... } }"];
	calback_module [shape=Mrecord,label="{ callback_main | { set_modle | set_locator_msg } }"];
	status_module [shape=Mrecord,label="{status_thread | {pub_tf | pub_view_msg} }"]
	sync_module [ shape=Mrecord,label="{sync_thread | add_data}" ]
	calback_module -> relocator_module [style=bold,label="set_control"];
	status_module -> relocator_module [style=bold,label="get_relomsg"];
	relocator_module -> status_module [style=bold,label="out_relomsg"];
	sync_module -> relocator_module [style=bold,label="add_sensor_data"];
}

结果图:
在这里插入图片描述