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

copy
size="4,4"
  • a->b->c;
  • b->d;
  • a[shape=polygon,sides=5,peripheries=3,color=lightblue,style=filled];
  • c[shape=polygon,sides=4,skew=0.4,label="helloworld"];
  • d[shape=invtriangle];
  • e[shape=polygon,side=4,distortion=.7];
  • }


  • 效果图


    3.list Graph

    copy
    node[shape=record,height=.1];
  • node0[label="<f0>|<f1>G|<f2>"];
  • node1[label="<f0>|<f1>E|<f2>"];
  • node2[label="<f0>|<f1>B|<f2>"];
  • node3[label="<f0>|<f1>F|<f2>"];
  • node4[label="<f0>|<f1>R|<f2>"];
  • node5[label="<f0>|<f1>H|<f2>"];
  • node6[label="<f0>|<f1>Y|<f2>"];
  • node7[label="<f0>|<f1>A|<f2>"];
  • node8[label="<f0>|<f1>C|<f2>"];
  • "node0":f2->"node4":f1;
  • "node0":f0->"node1":f1;
  • "node1":f0->"node2":f1;
  • "node1":f2->"node3":f1;
  • "node2":f2->"node8":f1;
  • "node2":f0->"node7":f1;
  • "node4":f2->"node6":f1;
  • "node4":f0->"node5":f1;
  • }



  • 4.hash table Graph

    copy
    nodesep=.05;
  • rankdir=LR;
  • node[shape=record,width=.1,height=.1];
  • node0[label="<f0>|<f1>|<f2>|<f3>|<f4>|<f5>|<f6>|",height=2.5]
  • node[width=1.5];
  • node1[label="{<n>n14|719|<p>}"];
  • node2[label="{<n>a1|719|<p>}"];
  • node3[label="{<n>i9|512|<p>}"];
  • node4[label="{<n>e5|632|<p>}"];
  • node5[label="{<n>t20|959|<p>}"];
  • node6[label="{<n>o15|794|<p>}"];
  • node7[label="{<n>s19|659|<p>}"];
  • node0:f0->node1:n;
  • node0:f1->node2:n;
  • node0:f2->node3:n;
  • node0:f5->node4:n;
  • node0:f6->node5:n;
  • node2:p->node6:n;
  • node4:p->node7:n;
  • }

  • 5.Process Graph

    copy
    subgraphcluster0{
  • node[style=filled,color=white];
  • style=filled;
  • color=lightgrey;
  • a0->a1->a2->a3;
  • label="process#1";
  • }
  • subgraphcluster1{
  • node[style=filled];
  • color=blue;
  • b0->b1->b2->b3;
  • label="process#2";
  • }
  • start->a0;
  • start->b0;
  • a1- b2- a3->end;
  • b3->end;
  • start[shape=Mdiamond];
  • end[shape=Msquare];
  • }

  • 6.directed Graph

    copy
    {abc}->{defg}
  • }

  • 7.化学分子式

    [cpp] copy
      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. }

    Ubuntu上玩转graphviz绘图工具的更多相关文章

    1. 移动端html5模拟长按事件的实现方法

      这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    2. ios – 在applicationWillEnterForeground触发时更改UIView

      本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

    3. UILabel导致应用程序在添加到视图时崩溃(仅限Xcode 6和iOS 8)

      我已将我的项目转换为Xcode6,以便为iOS8构建.但是,特定的UILabel会导致应用程序在添加到视图层次结构时崩溃.这是我收到的唯一错误日志:我无法在项目中的任何位置找到contentInsetsFromFonts方法.此外,我甚至无法在网上任何地方找到它的参考,包括Apple的文档.我没有为这个UIViewController使用NIB,因此UI是在loadView方法中构建的:该应用程序

    4. iOS 7通知中心与标签一样

      您可以试试,也许在将模糊应用到标签之前为模糊添加一点白色.

    5. iOS safari输入插入颜色

      我在iPhone设备上有一个小的CSS问题.我的搜索输入为蓝色,当用户关注它时,插入符号几乎不可见:在所有桌面浏览器中,即使在桌面Safari上,它也具有正确的颜色(白色).知道如何修复此问题并更改iOS设备上的插入颜色吗?

    6. 如何计算iOS 7中的实际字体大小(不是边框)?

      编辑:链接的“重复”问题仅涉及计算文本矩形.我需要在标签缩放之后计算实际字体大小,而不是字符串大小.此方法现已弃用:如何在iOS7中计算UILabel的字体大小,以缩小文字大小以适应?

    7. ios – 为什么在presentmodalviewcontroller调用时,navigationItem.titleView会左对齐?

      我正在使用UILabel作为导航栏的titleView.它工作正常,除了当我呈现模态视图控制器时,titleView从导航栏的中心移动到最左边.我在3.0及以上测试过.这是相关代码:截图:知道为什么会这样吗?

    8. ios – 在XCode中的UI测试期间无法访问自定义视图

      我们必须执行一些时髦的动画,这是我们最好的布局).问题是我无法访问此视图以模拟其上的点击.我可以使用app.staticText[“输入名称…”]访问标签,但是如果我点击它.记录我点击标签的会话将产生app.staticText[“输入名称…”

    9. ios – UITableView以编程方式调用滑动操作

      我有一个UITableView,用户可以向左滑动以显示动作.这一切都按预期工作.当用户点击单元格的某个部分时,我想触发这个.如何以编程方式调用此幻灯片动作?

    10. ios – 在SpriteKit中创建按钮:Swift

      我想在SpriteKit或SKScene中创建一个按钮,将视图发送到另一个视图控制器.我尝试使用“performSeguewithidentifier”,但显然SKScene不支持此功能.如何使用SpriteKit创建一个将视图发送到另一个视图的按钮?这是我尝试用来执行此操作的代码.带有“HomeButton.prepareForSegueWithIdentifier()”的行只是一个例子.它实际

    随机推荐

    1. crontab发送一个月份的电子邮件

      ubuntu14.04邮件服务器:Postfixroot收到来自crontab的十几封电子邮件.这些邮件包含PHP警告.>我已经解决了这些警告的原因.>我已修复每个cronjobs不发送电子邮件(输出发送到>/dev/null2>&1)>我删除了之前的所有电子邮件/var/mail/root/var/spool/mail/root但我仍然每小时收到十几封电子邮件.这些电子邮件来自cronjobs,

    2. 模拟两个ubuntu服务器计算机之间的慢速连接

      我想模拟以下场景:假设我有4台ubuntu服务器机器A,B,C和D.我想在机器A和机器C之间减少20%的网络带宽,在A和B之间减少10%.使用网络模拟/限制工具来做到这一点?

    3. ubuntu-12.04 – 如何在ubuntu 12.04中卸载从源安装的redis?

      我从源代码在Ubuntu12.04上安装了redis-server.但在某些时候它无法完全安装,最后一次makeinstallcmd失败.然后我刚刚通过apt包安装.现在我很困惑哪个安装正在运行哪个conf文件?实际上我想卸载/删除通过源安装的所有内容,只是想安装一个包.转到源代码树并尝试以下命令:如果这不起作用,您可以列出软件自行安装所需的步骤:

    4. ubuntu – “apt-get source”无法找到包但“apt-get install”和“apt-get cache”可以找到它

      我正在尝试下载软件包的源代码,但是当我运行时它无法找到.但是当我运行apt-cache搜索squid3时,它会找到它.它也适用于apt-getinstallsquid3.我使用的是Ubuntu11.04服务器,这是我的/etc/apt/sources.list我已经多次更新了.我尝试了很多不同的debs,并没有发现任何其他地方的错误.这里的问题是你的二进制包(deb)与你的源包(deb-src)不

    5. ubuntu – 有没有办法检测nginx何时完成正常关闭?

      &&touchrestarted),因为即使Nginx没有完成其关闭,touch命令也会立即执行.有没有好办法呢?这样的事情怎么样?因此,pgrep将查找任何Nginx进程,而while循环将让它坐在那里直到它们全部消失.你可以改变一些有用的东西,比如睡1;/etc/init.d/Nginx停止,以便它会休眠一秒钟,然后尝试使用init.d脚本停止Nginx.你也可以在某处放置一个计数器,这样你就可以在需要太长时间时发出轰击信号.

    6. ubuntu – 如何将所有外发电子邮件从postfix重定向到单个地址进行测试

      我正在为基于Web的应用程序设置测试服务器,该应用程序发送一些电子邮件通知.有时候测试是使用真实的客户数据进行的,因此我需要保证服务器在我们测试时无法向真实客户发送电子邮件.我想要的是配置postfix,以便它接收任何外发电子邮件并将其重定向到一个电子邮件地址,而不是传递到真正的目的地.我正在运行ubuntu服务器9.10.先感谢您设置本地用户以接收所有被困邮件:你需要在main.cf中添加:然后

    7. ubuntu – vagrant无法连接到虚拟框

      当我使用基本的Vagrantfile,只配置了两条线:我看到我的虚拟框打开,但是我的流氓日志多次显示此行直到超时:然后,超时后的一段时间,虚拟框框终于要求我登录,但是太久了!所以我用流氓/流氓记录.然后在我的物理机器上,如果我“流氓ssh”.没有事情发生,直到:怎么了?

    8. ubuntu – Nginx – 转发HTTP AUTH – 用户?

      我和Nginx和Jenkins有些麻烦.我尝试使用Nginx作为Jenkins实例的反向代理,使用HTTP基本身份验证.它到目前为止工作,但我不知道如何传递带有AUTH用户名的标头?}尝试将此指令添加到您的位置块

    9. Debian / Ubuntu – 删除后如何恢复/ var / cache / apt结构?

      我在ubuntu服务器上的空间不足,所以我做了这个命令以节省空间但是现在在尝试使用apt时,我会收到以下错误:等等显然我删除了一些目录结构.有没有办法做apt-getrebuild-var-tree或类似的?

    10. 检查ubuntu上安装的rubygems版本?

      如何查看我的ubuntu盒子上安装的rubygems版本?只是一个想法,列出已安装的软件包和grep为ruby或宝石或其他:)dpkg–get-selections

    返回
    顶部