Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2013-01-06) 使用graphviz画关系图

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

在学习离散数学“关系”一章时,需要画一个关系图,放到博客中。手画太麻烦,在群友致远的帮助下,找到了这个软件:graphviz,它可以用命令行的方式,生成美观的关系图。

dot

graphviz中包含一种名为dot的语言,专门用来定义关系。我们必须先在某个文件中写上代码,最后调用命令行生成。没有找到可边写边改的集成环境。

关于dot的具体语法参看官方文档,这里就不多说。这里仅用来入门。

简单例子

代码

从集合A到集合B的关系,代码如下。

digraph G {
    {a b c} -> {d e f}
}

保存在simple.gr文件中(文件名任选)。

### 生成图片

命令行

dot -Tpng -o simple.png simple.gr

读取simple.gr文件,以png格式将生成的图像保存到simple.png文件中

### 效果图

[![image](/user_images/1745-1.png "image")](/user_images/1745-1.png)

## 带中文的复杂例子

graphviz默认情况下对中文支持不好,如果代码中有中文,则必须使用UTF-8的格式保存文件,并且在代码中指定字体。

### 代码

把下列代码保存在`1.txt`文件中。

digraph G {
         edge[fontname = "STHUPO"];
         node[peripheries= 2 , fontname = "STHUPO"]
         size= "16,16";
         main[shape = box]; //标记 
         main[label = "从这里开始"]
         main-> parse [weight = 8] 
         parse-> execute;
         main-> init [style = dotted];
         main-> cleanup;
         execute-> {make_string;printf;}
         edge[color = red];
         init-> make_string[label = "1000次的感动"];
         main-> printf[label = "make a \n string"];

         node[shape = box,style = filled, color = ".7 .3 1.0"];
         execute-> compare;
}

注意一定要保存为`UTF-8`的格式,否则里面的中文会变成乱码!

还要注意里面有一行用来指定字体名,否则也无法正常显示中文:

node[peripheries= 2 , fontname = "STHUPO"] 

### 生成图片

命令行:

dot -Tpng -o 1.png 1.txt

表示使用文件1.txt中的指令,以png格式,把生成的图像写到1.png这个文件中。

效果

image

这里的中文有点难看,下面修正它。

Windows中的字体

换个字体试试

将上例中的字体换一个,比如微软雅黑,效果如下:

image

果然不一样了。

comments powered by Disqus