摘要本文会介绍使用Graphviz来绘制树形图。同时介绍使用Python中的graphviz来简单Graphviz的使用。
Graphviz是一个绘图工具,可以根据dot脚本画出树形图等。本文会介绍graphviz的简单使用,使用graphviz来创建dot文件来绘制树形图。本文还会通过几个graphviz的例子,来介绍graphviz的使用。
Graphviz编译的源文件是dot文件。我们通过书写dot文件,来获得不同的树状图。首先需要安装Graphviz,可以通过下面的链接进行安装,GraphvizDownload。关于Graphviz的说明,可以参考这个链接,有详细的例子解释,Graphviz中文文档。
我们将如下代码保存为graph01.dot文件:
接着使用命令dot-Tjpg./awesome_project/graph.dot-ograph01.jpg编译,可以得到名为graph01.jpg的图片,图片内容如下所示。
上面是一个简单的树状图的绘制,下面我们来看一个稍微复杂的情况,有以下的几个需求:
我们直接看一下最终的代码:
最终的效果如下所示:
graphviz支持子图,即图中的部分节点和边相对对立(软件的模块划分经常如此)。比如在下面的例子中,我们将「流量生成」,「批量流量还原」和「真实流量还原」是一个子图。「仿真环境」等是一个模块,完整的代码如下(需要注意,子图的名称必须以cluster开头,否则graphviz无法设别):
最终的效果如下图所示,可以看到我们设置了子图的背景色(同时也可以看一下node和edge的样式的设计):
我们可以安装GraphvizPreview插件来实时显示图像。在安装之前,我们需要确保Graphviz已经下载安装好了(GraphvizDownload),如果是Ubuntu,直接使用sudoaptinstallgraphviz安装即可。下图是GraphvizPreview插件,在全部安装完毕之后,就可以显示了:
上面我们直接使用dot文件来生成树形图。但是这样还是有些不是很方便,特别是当树形图比较复杂的时候。这个时候就可以结合python的graphviz库来进行绘制。首先需要使用pip来安装graphviz。
我们用graphviz的例子来进行说明。首先创建一个最基础的Graphviz图像,创建一个Hello->World的连接图。
最终绘制出的结果如下所示:
同时,我们可以通过g.source来获取dot代码。获取的结果如下所示:
在上面的基础上,我们可以增加树形图的样式。例如我们可以修改edge连接的箭头的样式。直接在上面初始化Digraph之后进行修改。
此时的树形图如下所示:
上面是从整体上修改整个图的样式。我们也可以单独修改某个node的样子。下面我们把某个node的样子修改为五角星。只需要直接在node中增加shape的参数,如下所示:
最终的效果图如下所示,关于node支持的形状,可以查看链接,Polygon-basedNodes:
我们还可以是设置更加复杂的node的样式,可以使用类似html的label。这些被写在label下,使用<,>来包裹内容。下面看一个例子,需要注意的是,下面在Digraph中使用了node_atrr,会对整个图的node全局有效,这里是使得node只显示文字,不显示边框:
最终的效果如下图所示:
这里会记录一些graphviz的例子,一些其他的树形图可以基于这些例子做进一步的扩展。这一部分的内容参考自,Graphviz的例子。
这个例子中,我们修改node的样式,使得如果通过node来进行定义,node为双圆的样式。
最终的结果如下所示,可以看到上面单独定义的,LR_0、LR_3、LR_4、LR_8都是两个圆:
我们可以创建多个graph,不同的graph的样式不同,最后将他们合并。直接看一下下面的例子。
最终的结果如下所示,左侧的使用灰色进行填充,右侧的为蓝色的边框:
上面我们介绍过类html标签来进行绘制,实际上我们可以进行一些简化,如下所示:
最终的结果如下所示,上面的f0等其实都是label,连线的时候会根据这些label进行连线。