- 浏览: 452741 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
进退取舍:
谢谢,这个用上了!!
Java 一个线程池的示例 -
pb_water:
感谢楼主,打算买楼主的书,支持一下,楼主功德无量
JavaScript内核系列第0版整理稿下载 -
lancezhcj:
有图会直观的多呢,再摸索摸索
有限自动机与建模 -
hsmsyy:
这里应该是原创了吧,楼主我觉得闭包的作用:实现面向对象。有待商 ...
JavaScript内核系列 第7章 闭包 -
wll52:
在应用退出之前,需要释放连接 con.disconnect() ...
使用smack与GTalk通信
Graphviz介绍
graphviz是贝尔实验室几个计算机牛人设计的一个开源 的图表(计算机科学中数据结构中的图)可视化项目,主要用C语言实现,主要实现了一些图布局算法。通过这些算法,可以将图中的节点在画布上比较均匀的分布,缩短节点之间的边长,并且尽量的减少边的交叉。
graphviz提供命令式的绘图方式,它提供一个dot语言 用来编写绘图脚本,然后对这个脚本进行解析,分析出其中的定点,边以及子图,然后根据属性进行绘制。具体的可以看一个例子,这个例子来自官方的文档。
digraph G { main -> parse -> execute; main -> init; main -> cleanup; execute -> make_string; execute -> printf init -> make_string; main -> printf; execute -> compare; }
digraph指定该图是一个有向图(directed graph),->表示一条边,main,parse,execute等是顶点,运行出来的效果很好看,如下图:
需要注意的是,我在这个dot脚本中没有指定任何的关于图的位置的信息,布局器会自动的根据图形的类型进行布局,并最终展现出来。
再来看一个比较复杂,并且是程序员经常使用的功能,数据结构图:
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; }
运行后的效果如下图所示:
不知道其他的程序员怎样,反正我对命令行情有独钟,比较喜欢这一类的工具。最早接触的计算机系统正是一个没有图形系统的BSD,由此对命令行的,没有界面的程序都特别感兴趣。
相关的想法
自从使用了graphviz以后,一直想着把这个好东西移植到java下来,大概的思想跟graphviz类似:
- 解析dot脚本,生成图的对象,这个图中包括节点,边以及子图等对象,这些对象上都绑定着相应的属性
- 将解析出来的图对象发送给layout engine进行处理,layout engine可以选择布局策略,比如流布局等
- 从layout engine中得到布局后的图对象,并交给image engine处理,得到最终结果,负责展示或者保存等
dot 的语法定义比较简单,我已经用javacc构造了一个dot的分析器,现在可以从dot文件中构建出图对象出来,不过还需要进一步完善,可以看看这个BNF定义:
graph -> [strict] (digraph|graph) id '{' stmt-list '}' stmt-list -> [stmt [';'] [stmt-list] ] stmt -> attr-stmt | node-stmt | edge-stmt | subgraph | id '=' id attr-stmt -> (graph | node | edge) attr-list attr-list -> '[' [a-list] ']' [attr-list] a-list -> id '=' id [','][a-list] node-stmt -> node-id [attr-list] node-id -> id [port] port -> port-location [port-angle] | port-angle [port-location] port-location -> ':' id | ':' '(' id ',' id ')' port-angle ->'@' id edge-stmt -> (node-id | subgraph) edgeRHS [attr-list] edgeRHS -> edgeop (node-id | subgraph) [edgeRHS] subgraph -> [subgraph id] '{' stmt-list '}' | subgraph id
(最近老是感觉时间不够用,有很多有意思的项目要做,比如要完善前几天说的那个bbms(Bus Based Message Service), 再比如修改用Swing和Smack做一个jabber的客户端jTalk,都是很有搞头的,唉,扯远了。)
当然graphviz的功能不至于此,它提供一个lib,可以用来将绘图引擎嵌入在自己的应用中。这是一个很有意义的事,我们可以不必掌握布局部分的复杂算法,把精力放在业务逻辑部分,将最后的图对象交给这个引擎来处理即可。当然,如果你正好和我一样,想了解其神奇的布局算法,不妨翻翻它的源码,欢迎交流之至。
我在周末分析了下graphviz的内部结构,并建立了一个java的项目jraph ,用来做简单的移植,主要是学习之用,其实,Java的图库还是相当丰富的,比如JGraph ,JGraphT,Prefuse,TouchGraph等等,用来做项目当然是很便捷的,但是我还是比较喜欢看着一个算法被自己实现的过程,特别是这种比较神奇的算法,哈哈。
预期中的API如下:
public static void main(String[] args){ Parser parser = new GCodeParser("file.g"); GraphSet gs = parser.parse(); GraphSet layouted = new GraphLayoutEngine(gs).layout(); ImageEngine imgEngine = new GraphImageEngine(layouted); imgEngine.export(0); }
同graphviz一样,先调用分析器构造出图的集合GraphSet(包括多个图,每个图中包括Vertex,Edge,及SubGraph),然后进行布局,最后将通过布局后的GraphSet绘制结果。目前完成了框架的设计部分,分析器部分基本完成,layout部分只实现了一个策略,即force-based 布局算法,不过layout engine被设计成可以插拔的模型,如果有了新的算法实现,可以很容易的整合起来。
p.s.如果时间允许,我会将这个项目jraph(暂定名)托管到google code上,到时候欢迎各路高人参加此项目。
发表评论
-
JavaScript内核系列 第15章 服务器端的JavaScript
2012-02-12 21:39 2335第15章已经在icodeit上发布,这一章分为上/下两篇,请朋 ... -
使用vim开发python及graphviz绘图
2011-12-23 14:49 6463基本需求 使用vim中的autocmd命令可以很容易的将正在 ... -
Java脚本技术应用实例
2011-01-22 11:24 4276前言 一直以来都很喜欢可以自由扩展的软件,这一点应该已经在很 ... -
可编程计算器(phoc)的设计与实现
2011-01-17 11:34 1989前言 借助JavaScript脚本 ... -
函数式编程(javascirpt)
2009-04-18 22:18 1273前言 Javascript,有人称 ... -
C和指针
2009-05-21 23:15 1121前言 指针是C的灵魂,正是指针使得C存在了这么多年,而且将长 ... -
C和指针(续)
2009-05-25 23:41 1363前言 上一篇《C和指针》可能对关于C和指针的有些内容没有说透 ... -
有限自动机与建模
2009-06-06 10:48 1792前言 在学校学程序设计语言的时候,能接触到的所有例子没有一个 ... -
事件和监听器
2009-06-21 22:06 1440前言 事件监听器是经 ... -
基于总线的消息服务(BBMS)的设计与实现
2009-07-25 22:19 1365前言 异步事件的通知机制在比较有规模的软件设计中必然会有涉及 ... -
JavaScript内核系列 第9章 函数式的Javascript
2010-05-13 19:20 3789第九章 函数式的Javascript 要说Ja ... -
JavaScript内核系列 第8章 面向对象的JavaScript(下)
2010-05-06 09:40 3674接上篇:JavaScript内核系列 第8章 面向对象的Jav ... -
JavaScript内核系列 第8章 面向对象的JavaScript(上)
2010-05-06 09:26 2913第八章 面向对象的 Javascript ... -
JavaScript内核系列 第7章 闭包
2010-05-04 08:48 3885第七章 闭包 闭包向来给包括JavaScript程序 ... -
JavaScript内核系列 第6章 正则表达式
2010-04-27 19:44 4059第六章 正则表达式 正则表达式是对字符串的结构 ... -
JavaScript内核系列 第5章 数组
2010-04-24 15:17 4543第五章 数组 JavaScript的数组也是一个比较 ... -
Swing小应用(Todo-List)之三
2010-04-22 20:47 2138前言 去年9月份开发的那个小工具sTodo,只是做到了能用, ... -
JavaScript内核系列 第4章 函数
2010-04-18 17:31 5097第四章 函数 函数,在C语言之类的过程式语言中 ... -
JavaScript内核系列 第3章 对象与JSON
2010-04-12 09:12 6147第三章 对象与JSON JavaScript对象与传 ... -
JavaScript内核系列 第2章 基本概念
2010-04-03 19:44 5704第二章 基本概念 ...
相关推荐
用户可以使用文本编辑器编写`.dot`文件描述图表结构,然后通过Graphviz工具将其转换为可视化图像。 7. **工具和插件**:除了核心命令行工具,可能还包含一些额外的工具和脚本,例如`gvpr`(图形处理语言)和`fdp`...
为了使用此功能,用户需要先安装Graphviz及其Python绑定。 5. **配置Graphviz环境**:在运行包含Graphviz输出的脚本之前,需要确保系统已经安装了Graphviz软件,并且Python环境正确配置了`graphviz`库。这通常涉及...
本手册旨在详细介绍 Graphviz 的使用方法及其内部结构,帮助用户更好地理解并利用这些强大的图形布局工具。 #### 二、字符串基础布局 在 Graphviz 中,可以通过多种字符串格式来表示图形数据。这些格式包括: 1. ...
总的来说,"系统软件开发 Bison实验1"是一个深入理解和应用编译器原理的过程,通过实际操作,你将能够掌握Bison工具的使用,理解编译器内部的工作机制,并增强你的编程和问题解决能力。这不仅对系统软件开发有重要...
Graphviz是一款强大的开源图形绘制工具,它能够帮助程序员和数据分析师可视化复杂的图形结构,如流程图、网络图、树状图等。在这个名为"quick-graphviz"的项目中,作者显然是在利用C++语言和Qt框架来探索如何高效地...
在学习过程中,学生将参与实际的编译器项目,可能使用C++或Java实现编译器的不同部分,同时还需要完成课后作业,比如使用Graphviz工具绘制程序的控制流图。最终,成绩将由项目、作业和期末考试共同决定。 总之,...
Cartography 是一个用 Python 编写的开源工具,其主要目的是帮助用户在基于 Neo4j 的直观图形界面中展示和理解复杂的基础设施资产及其相互关系。这个工具在 IT 运维、云资源管理和网络安全分析等领域具有广泛应用...
`Tree.dot`文件用于生成红黑树的图形表示,通过graphviz工具可视化。 区间树是一种特殊的树形数据结构,适用于处理区间查询和插入问题。在区间树中,每个节点代表一个区间,且每个节点的子节点的区间覆盖了父节点...
stabbed-android-1.0.3.zip是一个开源项目,其内部包含的DomainReverseMapper工具,正是针对这一需求而设计的,它能够帮助开发者从域类(Domain Classes)自动生成Graphviz图形,以直观地呈现类之间的关系。...
这个工具的核心功能是解析Scala代码,提取出类、对象、接口、继承关系等元数据,然后利用Graphviz库来绘制这些信息,生成可视化图形。Graphviz是一个强大的自动布局系统,可以创建各种复杂的图表,包括有向图、无向...
我们将深入探讨决策树的工作原理、应用及其在数据集"客户信息及违约表现.xlsx"上的实现。 首先,决策树的学习过程可以分为两个主要步骤:分割(splitting)和剪枝(pruning)。在分割阶段,算法会寻找最优特征来...
为了可视化决策树,可以使用`export_graphviz`函数将决策树模型导出为.dot文件,再借助graphviz工具将其转换为图形。这将使我们能直观地看到每个节点的特征选择和对应的分支条件。 此外,也可以使用`plot_tree`函数...
描述中的命令 "dot -Tpng -Gdpi=200 desktop.dot > desktop.png" 是一个使用Graphviz工具生成图形的命令。Graphviz是一个开源图形绘制软件,它使用DOT语言来描述图形结构。在这个命令中: - `dot` 是Graphviz的其中...
DOT语言则是Graphviz工具所使用的图形描述语言,用于描述有向图或无向图。在字典树的DOT表示中,每个节点和边代表树中的节点和连接,这使得我们可以可视化字典树的结构。生成的SVG(Scalable Vector Graphics)和PDF...
它的工作原理是通过执行traceroute命令收集网络中的路由器信息及其相互连接的关系,随后将这些数据转化为.dot格式的文件。.dot文件是一种图形描述语言,由Graphviz项目提供支持,用于定义图形结构并生成可视化输出。...
这部分将介绍一些实用的工具及其用法。 ### 知识点七:使用Python进行网络监控—第一部分 - **实验室设置**:这部分将介绍如何构建一个适用于网络监控的实验室环境。 - **SNMP**:简单网络管理协议(SNMP)是用于...
2. `tree.dot`:这是一个图形文件,可能包含了决策树的可视化表示,通常使用Graphviz工具进行绘制,可以直观地展示决策树的结构。 3. `temp.py`:这可能是一个临时脚本,用于处理数据或构建模型。 4. `Now.py`:...
在JavaScript的世界里,树状图是一种...总的来说,JS插件绘制树状图是数据可视化的强大工具,能够帮助我们有效地理解和呈现复杂的关系网络。正确选择和使用这些插件,可以让数据以更直观、生动的方式展现在用户面前。
3. 图形库选择:使用合适的图形库(如D3.js、ECharts、Graphviz等)进行绘制,这些库提供了丰富的图形元素和布局算法。 4. 布局算法:根据拓扑数据的特性,选择合适的布局算法,如力导向布局、层次布局等,使图形...
8. **可视化决策树**:如何使用工具(如Graphviz)展示决策树结构,帮助理解模型决策过程。 9. **DTREE与随机森林、梯度提升树的关系**:作为集成学习的一部分,解释DTREE如何与其他决策树模型结合增强预测性能。 ...