Ubuntu 14.04 64bit上玩转graphviz绘图工具

2024-03-18 15:58

本文主要是介绍Ubuntu 14.04 64bit上玩转graphviz绘图工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

关于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

digraph G { edge[fontname="FangSong"];node[peripheries=2, fontname="FangSong"];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;
}       
效果图


2.Polygon Graph

digraph G{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="hello world"];d[shape=invtriangle];                                                                                                                                                 e[shape=polygon, side=4, distortion=.7];}   


效果图


3.list Graph

digraph G{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

digraph G { 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

digraph G { subgraph cluster0 {node[style=filled, color=white];style=filled;color=lightgrey;a0->a1->a2->a3;label="process #1";}   subgraph cluster1 {node[style=filled];color=blue;b0->b1->b2->b3;label="process #2";}   start->a0;start->b0;a1->b3;b2->a3;a3->end;b3->end;start[shape=Mdiamond];end[shape=Msquare];                                                                                                                                                   
}       


6.directed Graph

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


7.化学分子式

graph s{C_0 -- H_0;C_0 -- H_1;C_0 -- H_2;C_0 -- C_1;C_1 -- H_3;C_1 -- H_4;C_1 -- H_5;
}

8.函数调用关系图

digraph s {node [shape=ellipse, style=filled, color="#40e0d0"];edge [color="#606060", penwidth=3];main [color=green];main -> init[color=blue, label="hello, I'm \llable of edge"];main -> mainloop;main -> exit;init -> a_init;init -> b_init;init -> c_init;mainloop -> select;
}

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


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

dot -Tpng collapsed_connection.dot -o collapsed_connection.png

digraph collapsed_connection {  accept -> TS_HTTP_POST_REMAP_HOOK;TS_HTTP_POST_REMAP_HOOK -> "check request method (and header)";"check request method (and header)" -> "get CacheUrl hash_key using MurmurHash3" [label = "GET request (required_header present)"];"check request method (and header)" -> "pass request" [label = "others"];"get CacheUrl hash_key using MurmurHash3" -> "check hash_key from hashTable";"check hash_key from hashTable" -> "lock URL in hashTable" [label = "not found"];"check hash_key from hashTable" -> "pass request" [label = "found, but marked pass"];"check hash_key from hashTable" -> "check hash_key from hashTable" [label = "locked or unable to get mutex, wait insert_lock_retry_time"];"lock URL in hashTable" -> TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK;TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK -> "remove URL from hashTable(1)" [label = "hit_fresh or skipped"];TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK -> "request origin server" [label = "miss or stale"];"request origin server" -> TS_HTTP_READ_RESPONSE_HDR_HOOK;TS_HTTP_READ_RESPONSE_HDR_HOOK -> "remove URL from hashTable(1)" [label = "not 200/OK response"];TS_HTTP_READ_RESPONSE_HDR_HOOK -> "check read_while_writer config";"check read_while_writer config" -> "remove URL from hashTable(1)" [label = "enabled"];"check read_while_writer config" -> TS_HTTP_TXN_CLOSE_HOOK [label = "disabled"];TS_HTTP_READ_RESPONSE_HDR_HOOK -> "mark pass in hashTable" [label = "non-cacheable"];"remove URL from hashTable(1)" -> TS_HTTP_TXN_CLOSE_HOOK;"mark pass in hashTable" -> TS_HTTP_TXN_CLOSE_HOOK;"pass request" -> TS_HTTP_TXN_CLOSE_HOOK;TS_HTTP_TXN_CLOSE_HOOK -> "remove URL from hashTable(2)";TS_HTTP_TXN_CLOSE_HOOK -> "check keep_pass_record_time" [label = "non-cacheable"];"check keep_pass_record_time" -> "add into KeepPassList" [label = "> 0"];"check keep_pass_record_time" -> "remove URL from hashTable(2)" [label = "= 0"];"add into KeepPassList" -> "transaction close";"remove URL from hashTable(2)" -> "transaction close";"transaction close" -> 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];"check request method (and header)" [shape = diamond];"check hash_key from hashTable" [shape = diamond];"check read_while_writer config" [shape = diamond];"check keep_pass_record_time" [shape = diamond];
} 



10.使用Makefile文件来批量执行

在阅读源码过程中,如果我们编写了大量的dot文件,需要处理和展示,如果逐个编译和操作,未免太为繁琐,我们这里推荐使用一个Makefile来将所有的dot文件都包括过来。

生成图像命令

make png

清除图像命令

make clean

下面是Makefile文件

SVG_FILES = \HttpProxyServer-callgraph.svg \HttpSM-callgraph.svg \HttpTransact-callgraph.svg \HttpTransact-state-diagram.svg \HttpTransactAndSM-callgraph.svgPNG_FILES = $(SVG_FILES:.svg=.png)PDF_FILES = $(SVG_FILES:.svg=.pdf)svg: ${SVG_FILES}png: ${PNG_FILES}pdf: ${PDF_FILES}clean:rm -f ${SVG_FILES} ${PNG_FILES} ${PDF_FILES}.SUFFIXES: .dot .svg .png .pdf.dot.svg:dot -Tsvg $< -o $@.dot.png:dot -Tpng $< -o $@.dot.pdf:dot -Tpdf $< -o $@

截图如下



注意事项

1.中文乱码

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

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

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

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



这篇关于Ubuntu 14.04 64bit上玩转graphviz绘图工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/822868

相关文章

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

墨刀原型工具-小白入门篇

墨刀原型工具-小白入门篇 简介 随着互联网的发展和用户体验的重要性越来越受到重视,原型设计逐渐成为了产品设计中的重要环节。墨刀作为一款原型设计工具,以其简洁、易用的特点,受到了很多设计师的喜爱。本文将介绍墨刀原型工具的基本使用方法,以帮助小白快速上手。 第一章:认识墨刀原型工具 1.1 什么是墨刀原型工具 墨刀是一款基于Web的原型设计工具,可以帮助设计师快速创建交互原型,并且可以与团队

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

OpenCompass:大模型测评工具

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模型问答项目问答性能评估方法大模型数据侧总结大模型token等基本概念及参数和内存的关系大模型应用开发-华为大模型生态规划从零开始的LLaMA-Factor

简鹿文件批量重命名:一款文件批量改名高手都在用的工具

作为 IT 行业的搬砖民工,互联网的数据量爆炸性增长,文件管理成为了一项日益重要的任务。"简鹿文件批量重命名"应运而生,旨在为用户提供一个高效、灵活的解决方案,以应对繁琐的文件命名、排序、创建及属性修改等挑战。 这款软件凭借其一键式操作、强大的自定义规则导入、以及全面的批量处理能力,极大地简化了文件管理流程,尤其适合处理大量文件的个人用户及企业环境,是提高工作效率、保持文件系统整洁的得力助手

如何用外呼工具和CRM管理系统形成销售闭环

使用外呼工具和CRM管理系统形成销售闭环是一个系统性的过程,它涉及客户数据的整合、个性化的营销活动、销售与市场活动的协作、顾客行为的追踪与理解以及营销成效的评估与优化等多个环节。 以下是如何将外呼工具和CRM管理系统有效结合以形成销售闭环的步骤: 1. 客户数据的整合与分析    - 外呼工具在与客户进行初步沟通时,会收集到客户的基本信息和初步需求。    - 这些信息随后被输入到CRM管

ASP.Net.WebAPI和工具PostMan

1.WebAPI概述 1.1 WebAPI WebAPI 是一种传统的方式,用于构建和暴露 RESTUI风格的Web服务。它提供了丰富的功能和灵活性,可以处理各种HTTP请求,并支持各种数据格式,如JSON、XML等。 WebAPI使用控制器(Controllers)和动作方法(ActionMethods)的概念、通过路由配置将请求映射到相应的方法上。 开发人员可以使用各种属性和过滤器来处

使用XmlPullParser制作BindView工具

在之前我写过了一个BindView的工具,之前使用的最要是正则表达的文本分析做的。最近,工作我认识了Android的XML解析,我又想起了这个问题。发现这个问题,其实用XmlPullParser更好解决。所以我重新写了这个工具。简单多了,而且不用格式化代码。 先分析一下如何写,简易思路如下 Created with Raphaël 2.1.0 输入文本路径 读取x