热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java绘图--dot基本使用

转自:原文地址dot是一种绘图语言,它可以方便你采用图形的方式快速、直观地表达一些想法,比如描述某个问题的解决方案,构思一个程序的流程,澄清一堆貌似散乱无章的事物之间的联系……等等。总

转自:原文地址


dot 是一种绘图语言,它可以方便你采用图形的方式快速、直观地表达一些想法,比如描述某个问题的解决方案,构思一个程序的流程,澄清一堆貌似散乱无章的事物之间的联系……等等。总之,当你打算使用铅笔在纸上乱画一些圈圈框框并用一些带箭头的线将它们联系起来的时候,不妨考虑一下使用 dot 来完成这个工作。

安装

dot 是 graphviz 软件包的一部分,这个 graphviz 是大名鼎鼎的贝尔实验室中的科学家们开发的,所以当我开始使用 dot 涂鸦的时候,感觉自己也很科学起来。graphviz 被很多 Unix-like 发行版的软件仓库收录了,因此 Unix-like 系统用户们略微动动手指即可拥有它。如果是 Windows 用户,也可以在graphiviz 官方网站的下载页面上获得 Windos 版本。

dot 一下 Hello world

下面,在我好为人师的过程中,我假定你已经正确安装了 graphviz。至于怎样验证已经正确安装了,这就是下面的 Hello World 要做的。

首先用你喜欢的文本编辑器(呆会我会建议你使用 Emacs 来写 dot 文件)建一个名为 hello.dot 的文件(或许应该要用 utf-8 编码),在其中填写以下内容:

graph hello {
        Node1 [label="Hello, World!"]
}

然后,在终端中使用 dot 命令编译这个文件: 

$ dot -Tpng hello.dot -o hello.png

其中,dot 命令的 '-T' 选项及其 'png' 参数告诉 dot 要将 hello.dot 文件编译输出为 png 格式的图形文件 hello.png,如下图所示:

如果你高兴,你也可以将 '-T' 选项的参数设置为 'pdf', 'svg, 'gif, 'dia'…… 至于 dot 具体有支持哪些格式的图形输出,可以通过 'man dot',查看 'OUTPUT FORMATS' 一节内容获知。

对我而言,最欣赏的是 dot 可以输出 'dia' 格式,这让我可以在 dia 这个软件中去对 dot 图形进行后续的一些调整或修改。不过,目前所导出的 dia 格式文档还不是很标准。dot 的文档中推荐使用 dotty 工具作为 GUI 工具直接对 dot 源文档进行调整。但是,我感觉 dotty 实在太丑陋。

dot 图形的基本结构

dot 所绘制的图形,其主要成分可以概括为:图、结点、边、标注。下面几个小例子可以帮助你理解这些概念。

首先来看一个只有图、结点和边的 dot 图形:

digraph test1{
    A -> B;    A -> C;   B -> D;    C -> D
}

digraph 是 dot 用于定义有向图的命令,在这里它定义了一幅名为 test1 的有向图,花括号中所包含的内容即为该有向图的内容,也就是结点和边。A, B, C, D 均为结点,而 '->' 符号表示有向边,从一个结点指向另一个结点。代码中的分号并非必须,只有你在将多行绘图语句放置在一行代码中的时候才需要用分号了隔离绘图语句。

从上述代码可见,你只需要将结点之间的关系告诉 dot,至于 dot 如何来绘制这幅图形,那不是你应该关心的,或许你想不到 dot 居然给出了如下图所示的输出,这或许与你原来的设想有些不一样,比如你可能是希望结点的分布是从左向右的,而不是从上向下的(其实也可以调整成从左向右的,但这是后话)。

dot 的图也可以是无向图,使用 graph 命令来定义。比如,将上例改写成无向图:

 

graph test2{
    A -- B;    A -- C;   B -- D;    C -- D
}

无向图与有向图的区别除了使用的定义命令不同之外,边的符号也由原来的 '->' 变为 '--'. 上例无向图输出如下图所示:

知道了这些,我们已经有了绘制 dot 图形的能力了,可以谈笑间绘出以下这幅图形来:

digraph test4 {
    main -> parse -> execute
    main -> init
    main -> cleanup
    execute -> make_string
    execute -> printf
    init -> make_string
    main -> printf
    execute -> compare
}

图形元素的属性

图、结点、边都可以进行许多属性方面的设置,这些属性主要用于改善图形的外观。我不鼓励你在设置 dot 图形元素属性方面投入很多的精力,因为 dot 图主要是用来达意的。除非你认为必须要对某些 dot 图形元素属性进行一些调整,如果不这样做,dot 图形就无法充分体现你的意图。下面通过一些很简化的示例来说明 dot 图形属性设定方式,具体的细节尚需要查看 dot 文档并动手尝试才可以获知。

图的属性

现在对一幅 dot 图形提出了以下外观的要求:

  1. 结点的布置是从左向右的
  2. 图带有标签,字体为 10pt

按照上述要求,再对照着『Drawing graphs with dot』文档的表 3(即图的属性表),可以很轻易地写出以下代码:

digraph g_attr_01 {
        rankdir = LR
        fOntsize= 10
        label = "图的属性设置示例"
       
        A -> B -> C -> D
}

结果如下图所示:

结点的属性

对于上例中的图形,进一步提出以下外观要求:

  1. 要求结点的形状是矩形
  2. 边框颜色为绿色
  3. 结点背景为浅蓝色
  4. 字号为 10pt

对照着『Drawing graphs with dot』文档的表 3(即图的属性表),则可以很轻易地写出以下代码:

digraph g_attr_01 {
        rankdir = LR
        fOntsize= 10
        label = "结点的属性设置示例"
       
        node [shape=box,.7 .3 1.0", color=green, fOntsize=10]
       
        A -> B -> C -> D
}

结果见下图:

由上例可见,使用在 node 命令的参数中所设置的结点属性会影响到其后所有的结点。有时候,我们需要单独设置某个结点的属性。譬如,要将结点 B 的形状设置为圆形,边框为红色并且不要背景填充,具体设置见下例:

digraph g_attr_01 {
        rankdir = LR
        fOntsize= 10
        label = "结点的属性设置示例"
       
        node [shape=box,.7 .3 1.0", color=green, fOntsize=10]
       
        A -> B -> C -> D
       
        B [shape = circle, color = red, text-align:center">

到目前位置,图形中结点的文本一直是默认使用它的 ID,事实上我们可以设定结点的 label 属性来显示我们期望显示的文本。譬如:

digraph g_attr_01 {
        rankdir = LR
        fOntsize= 10
        label = "结点的属性设置示例"
       
        node [shape=box,.7 .3 1.0", color=green,fOntsize=10]
       
        A -> B -> C -> D
       
        B [shape = circle, color = red, 我是结点"]
}

边的属性

以我个人的审美标准来判断,上述所有示例输出的图形有一个特点,那就是有向边的箭头过大。这可以通过设置边的属性进行调整。dot 图形的边属性可以从『Drawing graphs with dot』文档的表 2 查阅。下面的例子将箭头大小调整为默认大小的 0.5 倍。

digraph g_attr_01 {
        rankdir = LR
        fOntsize= 10
        label = "边的属性设置示例"
       
        node [shape=box,.7 .3 1.0", color=green,fOntsize=10]
        edge [arrowsize= .5]
       
        A -> B -> C -> D
       
        B [shape = circle, color = red, 我是结点"]
}

下面看一下如何设置边的标注 label 属性:

digraph g_attr_01 {
        rankdir = LR
        fOntsize= 10
        label = "边的属性设置示例"
       
        node[shape=box,.7 .3 1.0", color=green,fOntsize=10]
        edge[arrowsize= .5, fOntsize=10]

        A -> B[label="进入"]
        B -> C -> D
       
        B [shape = circle, color = red, 我是结点"]
}

在上例中,首先将边的标注字号设置为 10pt,然后为路径 A -> B 上的边添加了一个“进入”的标注。


推荐阅读
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了MicroATX(也称Mini ATX)和MATX主板规格,探讨了它们的结构特点、应用场景及对电脑系统成本和性能的影响。同时,文章还涵盖了相关操作系统的实用技巧,如蓝牙设备图标删除、磁盘管理等。 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 本文将介绍网易NEC CSS框架的规范及其在实际项目中的应用。通过详细解析其分类和命名规则,探讨如何编写高效、可维护的CSS代码,并分享一些实用的学习心得。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • Unity编辑器插件:NGUI资源引用检测工具
    本文介绍了一款基于NGUI的资源引用检测工具,该工具能够帮助开发者快速查找和管理项目中的资源引用。其功能涵盖Atlas/Sprite、字库、UITexture及组件的引用检测,并提供了替换和修复功能。文末提供源码下载链接。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • Kubernetes 持久化存储与数据卷详解
    本文深入探讨 Kubernetes 中持久化存储的使用场景、PV/PVC/StorageClass 的基本操作及其实现原理,旨在帮助读者理解如何高效管理容器化应用的数据持久化需求。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
author-avatar
博菡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有