Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1982|回复: 0

[默认分类] 利用Graphviz 画结构图

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-26 15:18:44 | 显示全部楼层 |阅读模式
    1. Graphviz介绍
        Graphviz是大名鼎鼎的贝尔实验室的几位牛人开发的一个画图工具。
    它的理念和一般的“所见即所得”的画图工具不一样,是“所想即所得”。  
    Graphviz提供了dot语言来编写绘图脚本。什么?!画个图也需要一个语言!!
    不要急,dot语言是非常简单地,只要看了下面几个列子,就能使用了。
      
    2. Graphviz的几个例子
        下面的几个例子都来自于官方文档。详情请见:Graphviz官网.
    2.1 Fancy graph

    1. [img]http://www.itdaan.com/imgs/5/0/4/6/28/9310e85a14af99de4811ff4c77f1f911.jpe[/img][img]http://www.itdaan.com/imgs/0/4/7/2/31/24a924a57ba6b3f2b51fc9edb7ea4186.jpe[/img] digraph G{
    2.         size = "4, 4";//图片大小
    3.         main[shape=box];/*形状*/
    4.         main->parse;
    5.         parse->execute;
    6.         main->init[style = dotted];//虚线
    7.         main->cleanup;
    8.         execute->{make_string; printf}//连接两个
    9.         init->make_string;
    10.         edge[color = red]; // 连接线的颜色
    11.         main->printf[style=bold, label="100 times"];//线的 label
    12.         make_string[label = "make a\nstring"]// \n, 这个node的label,注意和上一行的区别
    13.         node[shape = box, style = filled, color = ".7.3 1.0"];//一个node的属性
    14.         execute->compare;
    15. }
    复制代码


    从上面的代码可以看出,dot语言非常简单,就是一个纯描述性的语言而已。
    大家可以把上面的代码和下图中的连接对应起来看。
                                             
                                                  <图1. Fancy graph>
      
    2.2 Polygon graph

    1. [img]http://www.itdaan.com/imgs/5/0/4/6/28/9310e85a14af99de4811ff4c77f1f911.jpe[/img][img]http://www.itdaan.com/imgs/0/4/7/2/31/24a924a57ba6b3f2b51fc9edb7ea4186.jpe[/img] digraph G{
    2.         size = "4, 4"
    3.         a->b->c;
    4.         b->d;
    5.        
    6.         a[shape = polygon, sides = 5, peripheries=3, color = lightblue, style = filled];
    7.         //我的形状是多边形,有五条边,3条边框, 颜色的淡蓝色, 样式为填充
    8.         c[shape = polygon, sides = 4, skew= 0.4, lable = "hello world"];
    9.         //我的形状是4变形, 角的弯曲度0.4, 里面的内容为"hello world"
    10.         d[shape = invtriange];
    11.         //我是三角形
    12.         e[shape = polygon, side = 4, distortion = .7];
    13.         //我是梯形啊
    14. }
    复制代码


      
      
    下面是对应的图片:
                                                

                                            <图2. Polygon graph>

    2.3 连接点的方向
         我们可以用“n”,”ne”,”e”,””se”, “sw”,”w”,”nw”,
    分别表示冲哪一个方向连接这个节点(图形)-“north, northeast……”
    如:

    1. [img]http://www.itdaan.com/imgs/5/0/4/6/28/9310e85a14af99de4811ff4c77f1f911.jpe[/img][img]http://www.itdaan.com/imgs/0/4/7/2/31/24a924a57ba6b3f2b51fc9edb7ea4186.jpe[/img] digraph G{
    2.         //b->c[tailport = se];
    3.         b->c:se;
    4. }
    复制代码


      
      

                                                
                                                <图3. Se graph>
       

    2.4 数据结构图
        数据结构图是我们很容易用到的一类图形,一个简单地数据结构图代码如下:

    1. [img]http://www.itdaan.com/imgs/5/0/4/6/28/9310e85a14af99de4811ff4c77f1f911.jpe[/img][img]http://www.itdaan.com/imgs/0/4/7/2/31/24a924a57ba6b3f2b51fc9edb7ea4186.jpe[/img] digraph g{
    2.         node [shape = record,height=.1//我定义了我下面的样式;
    3.         node0[label = "<f0> |<f1> G|<f2> "];  
    4.         //我是一个node,我有三个属性,第二个的名字为G,其他两个为空
    5.         node1[label = "<f0> |<f1> E|<f2> "];  
    6.        node2[label = "<f0> |<f1> B|<f2> "];  
    7.        node3[label = "<f0> |<f1> F|<f2> "];  
    8.        node4[label = "<f0> |<f1> R|<f2> "];  
    9.        node5[label = "<f0> |<f1> H|<f2> "];  
    10.        node6[label = "<f0> |<f1> Y|<f2> "];  
    11.        node7[label = "<f0> |<f1> A|<f2> "];  
    12.        node8[label = "<f0> |<f1> C|<f2> "];  
    13.        
    14.         "node0": f2->"node4":f1;
    15.         //我的第三个属性连到node4的第二个属性
    16.         "node0": f0->"node1":f1;
    17.         "node1": f0->"node2":f1;
    18.         "node1": f2->"node3":f1;
    19.         "node2": f2->"node8":f1;
    20.         "node2": f0->"node7":f1;
    21.         "node4": f2->"node6":f1;
    22.         "node4": f0->"node5":f1;
    23. }
    复制代码


      
      
                                             
                                                   <图4. Data graph>
    2.5 Hash table graph

    1. [img]http://www.itdaan.com/imgs/5/0/4/6/28/9310e85a14af99de4811ff4c77f1f911.jpe[/img][img]http://www.itdaan.com/imgs/0/4/7/2/31/24a924a57ba6b3f2b51fc9edb7ea4186.jpe[/img] digraph g {
    2.         nodesep = .05;
    3.         rankdir = LR;
    4.        
    5.         node[shape = record, width = .1, height = .1];
    6.        
    7.         node0[label = "<f0> |<f1> |<f2> |<f3> |<f4> |<f5> |<f6> |", height = 2.5];
    8.         //我是一个节点,我有7个属性
    9.         node [width = 1.5];
    10.         node1[label = "{<n> n14 | 719 |<p>}"];
    11.         //我还是一个节点, 也定义了三个属性
    12.         node2[label = "{<n> a1 | 719 |<p>}"];
    13.         node3[label = "{<n> i9 | 512 |<p>}"];
    14.         node4[label = "{<n> e5 | 632 |<p>}"];
    15.         node5[label = "{<n> t20 | 959 |<p>}"];
    16.         node6[label = "{<n> o15 | 794 |<p>}"];
    17.         node7[label = "{<n> s19 | 659 |<p>}"];
    18.         //好了,我开始连接了
    19.         node0:f0->node1:n;
    20.         node0:f1->node2:n;
    21.         node0:f2->node3:n;
    22.         node0:f5->node4:n;
    23.         node0:f6->node5:n;
    24.         node2:p->node6:n;
    25.         node4:p->node7:n;
    26. }
    复制代码


      
    这是一个简单地哈希表,如下图所示
                                                   
                                                              <图5. Hash table graph>
      
      
    2.6 Process grahp
    下面画一个轻量级的流程图。

    1. [img]http://www.itdaan.com/imgs/5/0/4/6/28/9310e85a14af99de4811ff4c77f1f911.jpe[/img][img]http://www.itdaan.com/imgs/0/4/7/2/31/24a924a57ba6b3f2b51fc9edb7ea4186.jpe[/img] digraph g {
    2.         subgraph cluster0 {
    3.                 //我是一个子图,subgraph定义了我,
    4.                 node[style = filled, color = white];
    5.                 //我之内的节点都是这种样式
    6.                 style = filled;
    7.                 //我的样式是填充
    8.                 color = lightgrey;
    9.                 //我的颜色
    10.                 a0->a1->a2->a3;
    11.                 label = "prcess #1"
    12.                 //我的标题
    13.         }
    14.         subgraph cluster1 {
    15.                 //我也是一个子图
    16.                 node[style = filled];
    17.                 b0->b1->b2->b3;
    18.                 label = "process #2";
    19.                 color = blue;
    20.         }
    21.         //定义完毕之后,下面还是连接了
    22.         start->a0;
    23.         start->b0;
    24.         a1->b3;
    25.         b2->a3;
    26.         a3->end;
    27.         b3->end;
    28.        
    29.         start[shape=Mdiamond];
    30.         end[shape=Msquare];
    31. }
    复制代码


      
      
      
    结果输出图形如下:
                                                   
                                                    <图6. Hash table graph>
      
    3. 小结
        相信这几个列子下来,各位看官对graphviz也有了了解了吧,我个人用了一遍下来发现太爽了。
    而对于dot语言,作为一个描述性的语言就非常简单了, 只要有编程基础的人,模仿几个列子下来
    应该就能应用了。
        各位看官,有没有心动啊。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-12 00:27 , Processed in 0.319576 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表