欧卡2中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

需要三步,才能开始

只需两步,慢速开始

欧卡2入门方向盘选莱仕达V9莱仕达折叠便携游戏方向盘支架欢迎地图Mod入驻
查看: 17487|回复: 7
收起左侧

[开源] Graphviz使用手册

[复制链接]
知行 发表于 2013-8-8 07:58 | 显示全部楼层 |阅读模式
Dot语言基础
摘自维基百科DOT语言
DOT语言是一种文本图形描述语言。它提供了一种简单的描述图形的方法,并且可以为人类和计算机程序所理解。DOT语言文件通常是具有.gv或是.dot的文件扩展名。

很多程序都可以处理DOT文件。其中的一些,例如dot,neato,twopi,circo, fdp与sfdp,会读取DOT文件并将之渲染成为图形格式。其它的一些,比如gvpr,gc,accyclic,ccomps,sccmap和tred,可以读取DOT文件并对它代表的图形进行一些处理。类似于GVedit,lefty,dotty和grappa则提供了交互式的界面。以上程序大部分都包括在了Graphviz软件包中。

一、图形类别
1.无向图
在最简单的应用中,DOT语言可以用来描述一张无向图。无向图显示了对象间最简单的关系,例如人之间的友谊。使用关键字graph开始一张无向图的定义,并用大括号包含要描述的节点,双连字号(--)被用来描述节点间的关系。另外,一行的末尾需要加上分号(;)。
graph graphname {
     a -- b -- c;
     b -- d;
 }
使用发帖工具箱输入上述代码,帖子类型选择 Graphviz画图(dot),或者直接使用代码

superplot
显示效果如下:



superplot


2.有向图
类似于无向图,DOT语言也可以用来描述一张有向图,类似于流程图和树状图。其语法与无向图相似,但要在图的最开始使用关键字'digraph',并用箭头(->)表示节点直接的关系。
digraph graphname {
     a -> b -> c;
     b -> d;
 }
显示效果:


superplot


3.属性
DOT语言中,可以对节点和边添加不同的属性。这些属性可以控制节点和边的显示样式,例如颜色,形状和线形。可以在语句和句尾的分号间放置一对方括号,并在其中中放置一个或多个属性-值对。多个属性可以被逗号和空格(, )分开。节点的属性被放置在只包含节点名称的表达式后。
graph graphname {
     // label属性可以改变节点的显示名称
     a [label="Foo"];
     // 节点形状被改变了
     b [shape=box];
     // a-b边和b-c边有相同的属性
     a -- b -- c [ color=blue];  
     b -- d [style=dotted];
 }


superplot


4.注释
DOT语言支持C语言与C++风格的单行与多行注释。另外,也支持Shell脚本风格的以#开头的注释。注意:在论坛就不要用注释的代码了。


superplot


5.一个简单的例子
以下是一个描述了乙烷化学键结构的示例脚本。这是一个无向图,包括了上述解释的节点属性。
graph ethane {
     C_0 -- H_0 [type=s];
     C_0 -- H_1 [type=s];
     C_0 -- H_2 [type=s];
     C_0 -- C_1 [type=s];
     C_1 -- H_3 [type=s];
     C_1 -- H_4 [type=s];
     C_1 -- H_5 [type=s];
 }


superplot


更多资料
 楼主| 知行 发表于 2013-8-8 08:19 | 显示全部楼层
一、 设置点和线的形状和颜色
先看你一个例子:
digraph G {
        main -> parse -> execute;
        main -> init;
        main -> cleanup;
        execute -> make_string;
        execute -> printf
        init -> make_string;
        main -> printf;
        execute -> compare;
}
第一行给出了图的类型和名字
当一个点第一次出现,它就被创建了
用->标示符创建一条边
注意://digraph是有向图,graph是无向图,要注意,->用在有向图中,--用在无向图中表示一
条边,不能混用。
该上面代码置于tex=gv,dot标签中,显示结果如下:


superplot


//来看下一个稍微复杂点的例子,我们开始手动的设置一下图的属性。可以给点设置属性,
也可以给边设置属性。先来讲讲怎么设置边的属性,在每条边后面的双括号里设置边的
属性。也可以在用edge设置边的默认值。
//而给点设置属性就必须给每个点单独的设置一个属性,node表示点的默认值。
//点的默认参数是shape=ellipse, width=.75, height=.5 and labeled by the node name.
//一些点的形状在appendix.h 中,一些常用的形状有bos,circle,record,plaintext。
 楼主| 知行 发表于 2013-8-8 08:45 | 显示全部楼层
一些选在Graphviz画廊的图片:
Cluster


superplot


代码:
digraph G {

        subgraph cluster_0 {
                style=filled;
                color=lightgrey;
                node [style=filled,color=white];
                a0 -> a1 -> a2 -> a3;
                label = "process #1";
        }

        subgraph cluster_1 {
                node [style=filled];
                b0 -> b1 -> b2 -> b3;
                label = "process #2";
                color=blue
        }
        start -> a0;
        start -> b0;
        a1 -> b3;
        b2 -> a3;
        a3 -> a0;
        a3 -> end;
        b3 -> end;

        start [shape=Mdiamond];
        end [shape=Msquare];
}
 楼主| 知行 发表于 2013-8-8 08:49 | 显示全部楼层


superplot
digraph finite_state_machine {
        rankdir=LR;
        size="8,5"
        node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
        node [shape = circle];
        LR_0 -> LR_2 [ label = "SS(B)" ];
        LR_0 -> LR_1 [ label = "SS(S)" ];
        LR_1 -> LR_3 [ label = "S($end)" ];
        LR_2 -> LR_6 [ label = "SS(b)" ];
        LR_2 -> LR_5 [ label = "SS(a)" ];
        LR_2 -> LR_4 [ label = "S(A)" ];
        LR_5 -> LR_7 [ label = "S(b)" ];
        LR_5 -> LR_5 [ label = "S(a)" ];
        LR_6 -> LR_6 [ label = "S(b)" ];
        LR_6 -> LR_5 [ label = "S(a)" ];
        LR_7 -> LR_8 [ label = "S(b)" ];
        LR_7 -> LR_5 [ label = "S(a)" ];
        LR_8 -> LR_6 [ label = "S(b)" ];
        LR_8 -> LR_5 [ label = "S(a)" ];
}
 楼主| 知行 发表于 2013-8-8 08:51 | 显示全部楼层
ER图:


superplot
graph ER {
        node [shape=box]; course; institute; student;
        node [shape=ellipse]; {node [label="name"] name0; name1; name2;}
                code; grade; number;
        node [shape=diamond,style=filled,color=lightgrey]; "C-I"; "S-C"; "S-I";

        name0 -- course;
        code -- course;
        course -- "C-I" [label="n",len=1.00];
        "C-I" -- institute [label="1",len=1.00];
        institute -- name1;
        institute -- "S-I" [label="1",len=1.00];
        "S-I" -- student [label="n",len=1.00];
        student -- grade;
        student -- name2;
        student -- number;
        student -- "S-C" [label="m",len=1.00];
        "S-C" -- course [label="n",len=1.00];

        label = "\n\nEntity Relation Diagram\ndrawn by NEATO";
        fontsize=20;
}
 楼主| 知行 发表于 2013-8-8 08:54 | 显示全部楼层


superplot
oppo 发表于 2014-11-25 16:29 | 显示全部楼层
 楼主| 知行 发表于 2015-6-4 21:14 | 显示全部楼层


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

本版积分规则

联系我们|手机版|欧卡2中国 ( 湘ICP备11020288号-1 )

GMT+8, 2024-4-20 01:10 , Processed in 0.077222 second(s), 7 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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