• 概述

    Graphviz 是一个绘图工具集, 可以用 The DOT Language 的 DSL 来绘图。用 dot 写好脚本之后,使用不同的布局引擎来对脚本解析,生成图片,支持 PNG、PDF 等格式。Graphviz 有好几个布局引擎,一般使用的有dot (有向图) 和 circo(环形布局),其他的较少使用。

    Graphviz 包含 3 种图形元素,图(graph), 节点(node)边(edge)。每个元素都可以具有各自的属性,用来定义字体,样式,颜色,形状等。

安装

  • 安装graphviz程序

    1
    2
    3
    4
    5
    # Mac
    brew install graphviz

    # ubuntu
    sudo apt-get install graphviz

    或者到官网下载页面中, 找到对应平台的安装包安装。

  • 安装python-graphviz模块

    1
    sudo pip install graphviz

基本用法

通过实例化对象创建图形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from graphviz import Digraph

dot = Digraph(comment='this is direction')
dot.node('A', 'writer')
dot.node('B', 'doctor')
dot.node('C', 'teacher')

dot.edges(['AB', 'AC'])
dot.edge('B', 'C')
print dot.source

dot.format = 'png' # 默认是保存 pdf 格式
# view 表示保存成图片文件后是否直接打开
dot.render('output-graph.gv', view=True)
  • 生成的 dot 文件内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // this is direction
    digraph {
    A [label=writer]
    B [label=doctor]
    C [label=teacher]
    A -> B
    A -> C
    B -> C
    }
  • 生成的 png 图片

  • 字体乱码

    • UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 42: ordinal not in range(128)

      1
      2
      3
      4
      import os, time, sys
      if sys.getdefaultencoding() != 'utf-8':
      reload(sys)
      sys.setdefaultencoding('utf-8')

通过读取 dot 文件创建图形

  • dot源文件内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // this is direction
    digraph {
    node [] "Input | NodeA"[style="filled", color=black, fillcolor="chartreuse"] "Split | NodeD" "Conv | NodeB" "Relu | NodeC";

    "Input | NodeA" -> "Split | NodeD" [label="input0 1x3x224x224"]
    "Split | NodeD" -> "Conv | NodeB" [label="input0_split0 1x3x224x224"];
    "Split | NodeD" -> "Relu | NodeC" [label="input0_split1 1x3x224x224"];
    "Conv | NodeB" -> "Relu | NodeC" [label="conv1 1x32x112x112"];
    }
  • python示例代码

    1
    2
    3
    4
    5
    6
    from graphviz import Digraph, Source

    src = Source.from_file('output-graph-font.gv')
    print src.source
    src.format = 'png'
    src.render('output-graph.gv')
  • 生成的png图片

参考文章