GraphViz:2 DOT语法和相关应用

一、说明

1.1 Graphviz制图概述

总的来说,Graphviz 支持两类图:

  • 无向图 
  • 有向图 

1.2 组成部分

  • node 节点
  • edge 边
  • subgraph 子图
  • attr 属性

1.3 DOT文件

        dot文件是一个文本脚本,是专门存储有向图,或无向图的信息文件,通过dot指令可以将一个dot文件转化成图片,或pef文件,可视化完成。

二、 *.DOT文件要点----关于dot的语法

2.1 无向图的语法

1)如何生成以下的无向图?

2)语句如下:

              graph{ a--b; b--c; c--a;}

3)语法解释:

  •      graph{} 是图的关键词,任何图都包含该语句;
  •      a--b;是表示相邻顶点的“有边”关系,‘--’表示a顶点和b顶点可达,‘;’表该边描述语句完毕。

5)输出

将上述实现语句存入文本文件d:/new.dot,打开windows的cmd,进入cd d: 后,输入:

dot  -T   jpg  ./new.dot  -o  new-grap.jpg

输出完成,打开new-grap.jpg,得到:

   

图1   无向图的dot绘制案例 ( 左边图,不够美观,用graph{ a--{b,c}; b--c;} 语法代替生成右图。 )

2.2 简单有向图的语法 

 1)如何生成以下的有向图?

 2)语句如下:

             digraph{  a->b;   a->c;    c->d;}

3)语法解释:

  •      digraph{} 是有向图的关键词,任何图都包含digraph{}或graph{};
  •      a->b;是表示相邻顶点的“有向边”关系,‘->’表示a顶点和b顶点出入关系可达,‘;’表该边描述语句完毕。

5)输出

将上述实现语句存入文本文件d:/new.dot,打开windows的cmd,进入cd d: 后,输入:

dot  -T   jpg  ./new.dot  -o  new-grap.jpg

输出完成,打开new-grap.jpg,得到:

                                                        图2 有向图的DOT绘制案例 

 三、 更丰富的dot的语法

1)带标签的语法结构 

 

2)色彩丰富的图

digraph {

    player[label = "player", color = Blue, fontcolor = Red, fontsize = 24, shape = box];
    game[label = "game", color = Red, fontcolor = Blue, fontsize = 24, shape = ellipse];

    player -> game[label = "play"]
}

 3 在节点插入图片 

digraph {

    c[shape = none, image = "./D06.png"]
    a -> b -> c;
    c -> d;
}

  4 在节点插入图片 

节点和连线的统一定义(先进行node、edge的统一定义,在定义数据的节点):

digraph {

    node[color = Red, fontsize = 24, shape = box]
    edge[color = Blue, style = "dashed"]

    c[shape = none, image = "./pic.png"]
    a -> b -> c;
    c -> d;
}

 5 在一个图中,嵌入子图

digraph {
    label = visitNet
    rankdir = LR
    node[color = Red, fontsize = 24, shape = box]
    edge[color = Blue, style = "dashed"]

    user[style = "filled", color = "yellow", fillcolor = "chartreuse"]
    subgraph cluster_cd{
        label = "server and browser"
        bgcolor = green;
        browser -> server
    }
    user -> computer;
    computer -> browser;
}

 

 6 结构视图

注意点

1 用节点定义node[shape = record];定义节点是结构

2 用label=“字符串” 定义结构的内容,用“|”分割开

3 用<结构项标号>标明结构的单项标号

3 用  结构体:单项标号->结构体:单项标号  表明关系连线

digraph {

    node[shape = record];
    struct1[label = "<f0> left|<f1> mid&#92; dle|<f2> right"];
    struct2[label = "<f0> one|<f1> two"];
    struct3[label = "hello&#92;nworld | {b|{c|<here> d|e}|f}|g|h"];
    struct1:f1 -> struct2:f0;
    struct1:f2 -> struct3:here;
}

  7 树形结构

digraph tree {
  
  fontname = "PingFang-SC-Light"
  fontsize = 24

  node[shape = "plaintext"]

  1 -> 2;
  1 -> 3;
  2 -> 4;
  2 -> 5;
  3 -> 6;
  3 -> 7;
  4 -> 8;
  4 -> 9;
  5 -> 10;
  5 -> 11;
  6 -> 12;
  6 -> 13;
  7 -> 14;
  7 -> 15;
}

8 继承关系

digraph UML {

    node[fontname = "Courier New", fontsize = 10, shape = record];
    edge[fontname = "Courier New", fontsize = 10, arrowhead = "empty"];

    Car[label = "{Car | v : float\nt : float | run() : float}"]

    subgraph clusterSome{
        bgcolor = "yellow";
        Bus[label = "{Bus | | carryPeople() : void}"];
        Bike[label = "{bike | | ride() : void}"];
    }

    Bus -> Car
    Bike -> Car

}

 9 时序关系图

digraph time {

    rankdir = "LR";
    node[shape = "point", width = 0, height = 0];
    edge[arrowhead = "none", style = "dashed"];

    {
        rank = "same"
        edge[style = "solided"];
        APP[shape = "plaintext"];
        APP -> step00 -> step01 -> step02 -> step03 -> step04 -> step05;
    }
    
    {
        rank="same";
        edge[style="solided"];
        SDK[shape="plaintext"];
        SDK -> step10 -> step11 -> step12 -> step13 -> step14 -> step15;
    }
    {
        rank="same";
        edge[style="solided"];
        AliPay[shape="plaintext"];
        AliPay -> step20 -> step21 -> step22 -> step23 -> step24 -> step25;
    }
    {
        rank="same";
        edge[style="solided"];
        Server[shape="plaintext"];
        Server -> step30 -> step31 -> step32 -> step33 -> step34 -> step35;
    }

    step00 -> step10 [label="sends order info", arrowhead="normal"];
    step11 -> step21 [label="open AliPay", arrowhead="normal"];
    step22 -> step12 [label="pay success", arrowhead="normal"];
    step13 -> step03 [label="pay success", arrowhead="normal"];
    step24 -> step34 [label="pay success", arrowhead="normal"];
}

三、.DOT的布局器参考

        以下将说明这两类图的基本语法,同时,为了丰富图像,顶点和边都具有各自的属性,比如形状,颜色,填充模式,字体,样式等。主要的布局器如下:

  • dot: 默认布局方式,主要用于有向图;
  • neato:基于 sprint model 模型,又称force-based 或者 energy minimized;
  • twopi:径向布局,放射状;
  • circo:圆环布局;
  • fdp:无向图;
  • dotty:一个用于可视化与修改图形的图形用户界面程序;
  • lefty:一个可以显示 DOT 图形的可编程控件,并允许用户用鼠标在图上执行操作。

参考文章:

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无水先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值