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"];
}
效果图:
案例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"];
}
结果图:
评论(0)
您还未登录,请登录后发表或查看评论