图可视化之Graphviz

Graphviz 是由AT&T Research、Lucent Bell实验室开源的可视化图形工具,可以很方便的用来绘制结构化的图形网络。具体地,其使用一种名为dot语言的DSL来编写脚本​​
图可视化之Graphviz
abstract.jpg

安装

Mac下直接利用brew安装Graphviz即可

# 更新brew
brew update

# 安装Graphviz
brew install graphviz

安装后查看版本信息,验证安装是否成功

# 查看版本信息
dot -v
图可视化之Graphviz
figure 1.jpg

实践

无向图

// 无向图
graph graph1 {
    a -- b;
    b -- c;
    b -- f;
    a -- f;
}

可以直接通过如下命令进行渲染。典型地输出格式有:png、svg、jpeg等

# 将指定脚本文件 输出为 指定格式、指定名称的文件
dot <脚本文件名> -T <输出格式> -o <输出文件名>

# 将名为demo1.dot的脚本文件 输出为 格式为png、文件名为demo1.png的图片
dot demo1.dot -T png -o demo1.png

效果如下所示

图可视化之Graphviz
figure 2.jpg
图可视化之Graphviz
figure 3.jpg

有向图

// 有向图
digraph graph2 {
    a -> b;
    b -> d;
    c -> b;
    b -> b;

    // i -> j;
    // i -> k;
    // 该语句与上述语句效果等价
    i -> {j,k};

    // x -> z;
    // y -> z;
    // 该语句与上述语句效果等价
    {x,y} -> z;

    // n1 -> m1;
    // n2 -> m1;
    // n3 -> m1;
    // n1 -> m2;
    // n2 -> m2;
    // n3 -> m2;    
    // 该语句与上述语句效果等价
    {n1, n2, n3} -> {m1, m2};
}

为方便实时预览渲染效果,我们可以在VS Code当中编写dot脚本,然后在VS Code当中安装一个名为“Graphviz (dot) language support for Visual Studio Code”的插件

图可视化之Graphviz
figure 4.jpg

至此,我们就可以实现实时预览,效果如下所示

图可视化之Graphviz
figure 5.jpg

子图

子图可以提供一个单独的上下位文用于设置图的属性

// 子图
digraph subgraphDemo {
    // 设置节点的默认属性: 菱形、节点文本颜色为红色
    node [shape=diamond, fontcolor="red"];
    "杭州" -> "宁波";
    "温州" -> "台州";
    "宁波" -> "台州";

    // 定义一个名为"江苏省"的子图            
    subgraph "江苏省" {
        // 设置节点的默认属性: 六边形形、节点文本颜色为蓝色
       node [shape=hexagon, fontcolor="blue"];
        "南京" -> "苏州";
        "苏州" -> "无锡";
        "苏州" -> "扬州";
        "无锡" -> "扬州";
    }

    "杭州" -> "嘉兴";
    "温州" -> "杭州";
}

效果如下所示

图可视化之Graphviz
figure 6.jpg

集群

当子图的名称以cluster开头时,则Graphviz会将该子图标记为Cluster集群。此时布局引擎会将集群内的节点绘制在一起,并在外部使用一个矩形框对其进行包裹。需要注意的是,该特性依赖于布局引擎

// 集群
digraph clusterDemo {

    "Auth Controller";
    "Order Controller" -> "Order Service";
    "Pay Controller" -> "Pay Service";

    "Order Service" -> "Order Dao";
    "Pay Service" -> "Pay Dao";
        
    subgraph "cluster_service" {
        label="Service层";
        "Order Service";
        "Log Service";
        "Pay Service";
        
    }

    subgraph "cluster_dao" {
        label="Dao层";
        "Order Dao";
        "Pay Dao";
    }
}

效果如下所示

图可视化之Graphviz
figure 7.jpg

属性设置

Graphviz提供了丰富的属性设置,以满足不同的可视化需求,实现丰富的展示效果,下面即是一个示例

// 属性设置
digraph graph3 {

    // 设置图形属性: 图形名称
    label = "属性设置效果图";
    // 设置图形属性: 图形名称的位置位于顶部
    labelloc="t"
    // 设置图形属性: 画布背景色为 蓝、黄 渐变
    bgcolor = "lightblue:lightyellow";

    // 设置节点的默认属性: 菱形、节点文本颜色为红色
    node [shape=diamond, fontcolor="red"];
    // 设置a节点的属性: 三角形、图形颜色为绿色、节的文本为指定文本
    a [shape=triangle, color=green, label="Hello"];
    
    // 设置边的默认属性: 虚线
    edge [style=dashed];

    a -> b;
    // 设置指定边的属性: 点线、边的文本为指定文本
    c -> b[style=dotted, label="21"];
    // 设置指定边的属性: 箭头尾部符号为方形、箭头头部符号为V形、箭头头部尾部均绘制
    b -> k[dir=both, arrowtail=box, arrowhead=vee];
    // 设置指定边的属性: 箭头尾部符号为方形、箭头头部符号为V形、只绘制箭头头部
    b -> i[dir=forworad, arrowtail=box,arrowhead=vee];
    // 设置指定边的属性: 箭头尾部符号为方形、箭头头部符号为V形、只绘制箭头尾部
    b -> j[dir=back, arrowtail=box, arrowhead=vee];
}

效果如下所示

图可视化之Graphviz
figure 8.jpg

参考文献

  1. 领域特定语言(2013年版) Martin Fowler著

原文始发于微信公众号(青灯抽丝):图可视化之Graphviz

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/156357.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!