zoukankan      html  css  js  c++  java
  • DOT + graphviz 轻松画图

    一、简介DOT & graphviz
    1. DOT

        DOT是一种文本图形描述语言。DOT语言文件通常具有.gv或是.dot的文件扩展名。当然,在编写好.dot或者.gv的文件之后,需要有专门的程序处理这些文件并将其渲染成为图片,dot就是其中一款程序,它可以将DOT语言描述的图形渲染成.png、.jpg、.pdf等多种类型。
        当然,作为工具,dot本身是很原始的,就像gcc之于c代码,g++之于cpp代码一样,或许某些程序员会热衷于在终端使用这些工具,但也有很多人喜欢交互式的界面,所以就有了gvedit之类的工具,它提供交互式的窗口来使用dot等工具渲染DOT语言描述的图形。
    2. graphviz
        graphviz是一个开源软件包,上述dot和gvedit等工具都在该软件包中。
        所以,不妨简单的认为DOT是一门图形描述语言而graphviz是处理该语言文件的一个集成化的工具。

    二、使用DOT & graphviz
    1. 环境配置(ubuntu)

    sudo apt-get install graphviz

    2. 应用实例

    创建test.dot文件内容如下:

    digraph g {
    node [shape=plaintext]
    A1 -> B1
    A2 -> B2
    A1 -> A2
    B1 -> B2
    }

    在终端直接调用dot命令处理文本并生成图片。以把test.dot导出为test.png为例,命令为:dot -Tpng -o test.png test.dot 

    三、DOT语法
        现在已经可以愉快的使用DOT & graphviz绘图了,唯一需要的就是更好的了解DOT语法,以绘出我们期望的效果。
        DOT语法相对简单和松散,没有特别的格式要求,也没有复杂的运算符和结构。
    1. 基本语法
        graph(无向图)或者digraph(无向图)表示图,然后{}中的内容是对图的描述,注释风格和C类似(“//”用于单行注释,/**/用于多行注释)。如一个无向图:

     

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. graph graph1 {      //无向图graph1  
    2.     a -- b          //节点a和b之间连线  
    3. }  

    2. 节点
        DOT中,节点可以不用声明直接使用。每个节点首次出现的名称做为该节点的唯一标识。
        属性设置:对节点可以设置的常见通用属性有shape、label、style、color、fillcolor、rank等,对于不同的形状,可能还有不同的属性可以设置,如对于多边形可以设置边数等。节点属性设置时,node用于设置默认属性(对设置位置之后的点有效),在点后面用[]设置单独一个点的属性。

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. graph node_settings {  
    2.     node [shape = "box", style = "filled", color = "black", fillcolor = "green"]   //设置节点的默认形状,类型,颜色,填充颜色  
    3.     a [shape = "ellipse", color = "red", label = "this is a"]     //设置节点a的颜色,注意默认节点类型是filled,所以这里的color只是设置a的边框颜色  
    4.     b [label = "two lines"]   //label支持' '换行  
    5.     a -- b  
    6.     a -- c     //如果不需要设置c的属性,可以不用声明c而直接使用  
    7.     node [shape = "circle"]  
    8.     d [label = "cicle"]  
    9.     c -- d      //d使用之前最后出现的node设置,形状为circle  
    10.     {rank = same a, d}     //设置a和d在同一层  
    11. }     

    3. 边
        边有有向边和无向边两种,无向边用于无向图,有向边用于有向图,不可混用。
        属性设置:边的常见设置有style、color、weight、label、labelfontcolor、headlabel、taillabel、decorate等,对于有向边,还可以设置边的起点位置等(用n、e、s、w和相邻字母的组合表示位置)。和节点类似的,边属性设置时,用edge[]设置默认属性,在边之后用[]设置单独一条边的属性。

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. digraph edge_settings {  
    2.     edge [color = "green", decorate = false]        //设置边的默认属性  
    3.     node [shape = "polygon", sides = 4, color = "blue"]  
    4.     a -> b [style = "dotted", color = "red", label = "a to b"]  //设置style、color、label  
    5.     b: se -> c: w [headlabel = "end",  taillabel = "start"]     //设置边从b的“东南方”出发,从c的“西方”结束,设置有向边起点和重点的label  
    6.     edge [style = "bond", decorate = true]      //设置之后的边加粗并且标签和连线之间有线标注  
    7.     {c, f} -> {d, e} [label = "multi-lines"]    //可以用这种方式同时画多条边  
    8. }  

    4. 图
        从前面的例子中已经可以看出,DOT语言可以描述无向图和有向图两种图,graph标识无向图,digraph标识有向图。
        属性设置:在一个图的开头写入属性即可设置图形的属性,常用的图形属性有size、label、labelloc、labeljust、bgcolor、rankdir等。
        子图,可以进行和“父图”类似的设置,唯一注意的是子图必须以"cluster"做为名称的开始。
        下面是实现的官网首页上的图:

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. digraph graph_settings {  
    2.     start [shape = "Mdiamond"]  
    3.     end [shape = "Msquare"]  
    4.       
    5.     subgraph cluster_sub1 {  
    6.         label = "process #1"  
    7.         labelloc = "t"  
    8.         bgcolor = "gray55"  
    9.         node [style = "filled", color = "white"]  
    10.         a0 -> a1 -> a2 -> a3 -> a0  
    11.     }  
    12.     subgraph cluster_sub2 {  
    13.         label = "process #2"  
    14.         labelloc = "t"  
    15.         color = "blue"  
    16.         node [style = "filled", color = "black", fillcolor = "gray55"]  
    17.         b0 -> b1 -> b2 -> b3  
    18.     }  
    19.       
    20.     start -> {a0, b0}  
    21.     a1 -> b3  
    22.     b2 -> a3  
    23.     {a3, b3} -> end  
    24. }  

    本文参考:http://blog.csdn.net/stormdpzh/article/details/14648827

    三、DOT语法
        现在已经可以愉快的使用DOT & graphviz绘图了,唯一需要的就是更好的了解DOT语法,以绘出我们期望的效果。
        DOT语法相对简单和松散,没有特别的格式要求,也没有复杂的运算符和结构。
    1. 基本语法
        graph(无向图)或者digraph(无向图)表示图,然后{}中的内容是对图的描述,注释风格和C类似(“//”用于单行注释,/**/用于多行注释)。如一个无向图:

     

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. graph graph1 {      //无向图graph1  
    2.     a -- b          //节点a和b之间连线  
    3. }  

    2. 节点
        DOT中,节点可以不用声明直接使用。每个节点首次出现的名称做为该节点的唯一标识。
        属性设置:对节点可以设置的常见通用属性有shape、label、style、color、fillcolor、rank等,对于不同的形状,可能还有不同的属性可以设置,如对于多边形可以设置边数等。节点属性设置时,node用于设置默认属性(对设置位置之后的点有效),在点后面用[]设置单独一个点的属性。

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. graph node_settings {  
    2.     node [shape = "box", style = "filled", color = "black", fillcolor = "green"]   //设置节点的默认形状,类型,颜色,填充颜色  
    3.     a [shape = "ellipse", color = "red", label = "this is a"]     //设置节点a的颜色,注意默认节点类型是filled,所以这里的color只是设置a的边框颜色  
    4.     b [label = "two lines"]   //label支持' '换行  
    5.     a -- b  
    6.     a -- c     //如果不需要设置c的属性,可以不用声明c而直接使用  
    7.     node [shape = "circle"]  
    8.     d [label = "cicle"]  
    9.     c -- d      //d使用之前最后出现的node设置,形状为circle  
    10.     {rank = same a, d}     //设置a和d在同一层  
    11. }     

    3. 边
        边有有向边和无向边两种,无向边用于无向图,有向边用于有向图,不可混用。
        属性设置:边的常见设置有style、color、weight、label、labelfontcolor、headlabel、taillabel、decorate等,对于有向边,还可以设置边的起点位置等(用n、e、s、w和相邻字母的组合表示位置)。和节点类似的,边属性设置时,用edge[]设置默认属性,在边之后用[]设置单独一条边的属性。

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. digraph edge_settings {  
    2.     edge [color = "green", decorate = false]        //设置边的默认属性  
    3.     node [shape = "polygon", sides = 4, color = "blue"]  
    4.     a -> b [style = "dotted", color = "red", label = "a to b"]  //设置style、color、label  
    5.     b: se -> c: w [headlabel = "end",  taillabel = "start"]     //设置边从b的“东南方”出发,从c的“西方”结束,设置有向边起点和重点的label  
    6.     edge [style = "bond", decorate = true]      //设置之后的边加粗并且标签和连线之间有线标注  
    7.     {c, f} -> {d, e} [label = "multi-lines"]    //可以用这种方式同时画多条边  
    8. }  

    4. 图
        从前面的例子中已经可以看出,DOT语言可以描述无向图和有向图两种图,graph标识无向图,digraph标识有向图。
        属性设置:在一个图的开头写入属性即可设置图形的属性,常用的图形属性有size、label、labelloc、labeljust、bgcolor、rankdir等。
        子图,可以进行和“父图”类似的设置,唯一注意的是子图必须以"cluster"做为名称的开始。
        下面是实现的官网首页上的图:

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. digraph graph_settings {  
    2.     start [shape = "Mdiamond"]  
    3.     end [shape = "Msquare"]  
    4.       
    5.     subgraph cluster_sub1 {  
    6.         label = "process #1"  
    7.         labelloc = "t"  
    8.         bgcolor = "gray55"  
    9.         node [style = "filled", color = "white"]  
    10.         a0 -> a1 -> a2 -> a3 -> a0  
    11.     }  
    12.     subgraph cluster_sub2 {  
    13.         label = "process #2"  
    14.         labelloc = "t"  
    15.         color = "blue"  
    16.         node [style = "filled", color = "black", fillcolor = "gray55"]  
    17.         b0 -> b1 -> b2 -> b3  
    18.     }  
    19.       
    20.     start -> {a0, b0}  
    21.     a1 -> b3  
    22.     b2 -> a3  
    23.     {a3, b3} -> end  
    24. }  
  • 相关阅读:
    P1273 有线电视网
    P2015 二叉苹果树
    POJ 3659 Cell Phone Network
    POJ 1463 Strategic game
    NC51178 没有上司的舞会
    NC15033 小G有一个大树
    13. SpringBoot 日志框架的默认配置 和 指定日志文件 以及 ProFile 功能
    12. SpringBoot 日志框架的关系 研究中间包的替换
    11. SpringBoot 日志框架 — 解决和思路
    41.el和template区别 & VUE实现分离写法
  • 原文地址:https://www.cnblogs.com/alenoscar/p/6064737.html
Copyright © 2011-2022 走看看