Ubuntu上玩转graphviz绘图工具

http://blog.csdn.net/tao_627/article/details/26128001

简介

关于Graphviz: Graphviz(英文:Graph Visualization Software的缩写)是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形。它也提供了供其它软件使用的库。Graphviz是一个自由软件,其授权为Eclipse Public License。其Mac版本曾经获得2004年的苹果设计奖。

Graphviz是大名鼎鼎的贝尔实验室的几位牛人开发的一个画图工具。它的理念和一般的“所见即所得”的画图工具不一样,是“所想即所得”。
Graphviz提供了dot语言来编写绘图脚本。dot的语言专门用来定义关系。我们必须先在某个文件中写上代码,最后调用命令行生成。没有找到可边写边改的集成环境。
关于dot的具体语法参看官方文档,这里就不多说。这里仅用来入门。

http://www.graphviz.org/

另外也有专门渲染DOT脚本的浏览器xdo,直接在窗口渲染,不需要生成图像文件,强烈推荐。

很多图都比较适合用DOT来定义,比如流程图,组织关系图,类图,状态转换图等等。

在刚接触DOT不到3天的时间里,我就分别在代码性能优化,协议栈状态机定义两件事情用到了DOT,感觉非常方便。

性能优化:gprof可以对一个程序运行时进行profiling,生成报告,包括函数调用关系,每个函数调用次数,花费的时间。但这个报告是文本的,不够直观。可以通过一个gprof2dot.py脚本,把gprof的输出翻译成一个DOT文件,然后再用Graphviz转成图片或者直接用xdot来查看。

安装graphviz
sudo apt-get install graphviz graphviz-doc
这样会安装dot语言的执行文件,执行文件路径在
/usr/bin/dot
绘图方法
先根据业务需要编写dot文件,参见下面的示例部分,然后编译运行。输出格式可以根据自己的需要来灵活选择
例如test.dot,产生图片
dot -Tpng test.dot -o test.png
dot -Tsvg test.dot -o test.svg
dot test.dot -Tpdf -o test.pdf

典型示例(更多例子可以参见官方文档)

1.Fancy Graph

[html] view plain copy
  1. digraphG{
  2. edge[fontname="FangSong"];
  3. node[peripheries=2,fontname="FangSong"];
  4. size="16,16";
  5. main[shape="Box"];
  6. main[label="从这里开始"]
  7. main->parse[weight=8]
  8. parse->execute;
  9. >init[style=dotted];
  10. main->cleanup;
  11. execute->{make_string;printf;}
  12. edge[color=red];
  13. init->make_string[label="1000次的感动"];
  14. >printf[label="makea\nstring"];
  15. node[shape=Box,style=filled,color=".7.31.0"];
  16. >compare;
  17. }
效果


2.polygon Graph



效果图


3.list Graph




4.hash table Graph


5.Process Graph


6.directed Graph


7.化学分子式

    graphs{
  1. C_0--H_0;
  2. C_0--H_1;
  3. C_0--H_2;
  4. C_0--C_1;
  5. C_1--H_3;
  6. C_1--H_4;
  7. C_1--H_5;
  8. }

8.函数调用关系图


这个是有向图(directional graph), 脚本的第一个词需要换成"digraph"。常用的属性有color,style,shape,penwidth,label等。label中 \r,\l,\n 都表示换行,但对齐方式分别是 右对齐,左对齐,居中


9.ATS中插件collapsed_connection的流程图,一个更复杂的例子

copy
digraphcollapsed_connection{
  • accept->TS_HTTP_POST_REMAP_HOOK;
  • TS_HTTP_POST_REMAP_HOOK->"checkrequestmethod(andheader)";
  • "checkrequestmethod(andheader)"->"getCacheUrlhash_keyusingMurmurHash3"[label="GETrequest(required_headerpresent)"];
  • "checkrequestmethod(andheader)"->"passrequest"[label="others"];
  • "getCacheUrlhash_keyusingMurmurHash3"->"checkhash_keyfromhashTable";
  • "checkhash_keyfromhashTable"->"lockURLinhashTable"[label="notfound"];
  • "checkhash_keyfromhashTable"->"passrequest"[label="found,butmarkedpass"];
  • >"checkhash_keyfromhashTable"[label="lockedorunabletogetmutex,waitinsert_lock_retry_time"];
  • "lockURLinhashTable"->TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK;
  • TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK->"removeURLfromhashTable(1)"[label="hit_freshorskipped"];
  • TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK->"requestoriginserver"[label="missorstale"];
  • "requestoriginserver"->TS_HTTP_READ_RESPONSE_HDR_HOOK;
  • TS_HTTP_READ_RESPONSE_HDR_HOOK->"removeURLfromhashTable(1)"[label="not200/OKresponse"];
  • TS_HTTP_READ_RESPONSE_HDR_HOOK->"checkread_while_writerconfig";
  • "checkread_while_writerconfig"->"removeURLfromhashTable(1)"[label="enabled"];
  • "checkread_while_writerconfig"->TS_HTTP_TXN_CLOSE_HOOK[label="disabled"];
  • >"markpassinhashTable"[label="non-cacheable"];
  • "removeURLfromhashTable(1)"->TS_HTTP_TXN_CLOSE_HOOK;
  • "markpassinhashTable"->TS_HTTP_TXN_CLOSE_HOOK;
  • "passrequest"- TS_HTTP_TXN_CLOSE_HOOK->"removeURLfromhashTable(2)";
  • TS_HTTP_TXN_CLOSE_HOOK->"checkkeep_pass_record_time"[label="non-cacheable"];
  • "checkkeep_pass_record_time"->"addintoKeepPassList"[label=">0"];
  • "checkkeep_pass_record_time"->"removeURLfromhashTable(2)"[label="=0"];
  • "addintoKeepPassList"->"transactionclose";
  • "removeURLfromhashTable(2)"->"transactionclose";
  • "transactionclose"->accept;
  • TS_HTTP_POST_REMAP_HOOK[shape=box];
  • TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK[shape=box];
  • TS_HTTP_READ_RESPONSE_HDR_HOOK[shape=box];
  • TS_HTTP_TXN_CLOSE_HOOK[shape=box];
  • "checkrequestmethod(andheader)"[shape=diamond];
  • "checkhash_keyfromhashTable"[shape=diamond];
  • "checkread_while_writerconfig"[shape=diamond];
  • "checkkeep_pass_record_time"[shape=diamond];
  • }



  • 注意事项

    1.中文乱码

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

    进一步深究可以查看官方文档

    http://www.graphviz.org/Documentation.PHP

    下面给出几个颇具震撼力的效果图,来自官网文档


    相关文章

    目录前言一、创建Hadoop用户二、更新apt和安装Vim编辑器三、...
    原文连接:https://www.cnblogs.com/yasmi/p/5192694.html ...
    电脑重启后,打开VirtualBox,发现一直用的虚拟机莫名的消失...
    参见:https://blog.csdn.net/weixin_38883338/article/deta...
    Ubuntu 18.04 LTS 已切换到 Netplan 来配置网络接口。Netpla...
    介绍每个 Web 服务都可以通过特定的 URL 在 Internet 上访问...