如何利用Graphviz画有向图/无向图

任务说明

我现在有一张图,这张图的储存方式为:

  • 一个列表包含所有节点
  • 节点中储存着节点与节点之间的关系

这张图的结构为:

  • 节点分为输入节点,中间节点和输出节点
  • 我希望输出节点和输入节点能够在一排或一列显示

结果如下:

安装Graphviz

graphviz实际上是一个软件,但是可以用python生成dot脚本,再用graphviz解析得到图片

step1. 下载Graphviz软件

下载路径:

https://graphviz.gitlab.io/_pages/Download/Download_windows.html

安装时需要将bin文件夹的路径加入到环境变量path

注意在安装的时候会有提示是否要把bin加入环境变量,直接勾选即可,省去很多步骤

step2. pip安装graphviz

1
pip install graphviz

Graphviz的一些使用方法

1
import graphviz as gz

创建图

有向图

1
graph = gz.Digraph()

无向图

1
graph = gz.Graph()

创建节点

1
graph.node(name='a')

name只能为字符串

node属性:

attrs describe
name 相当于id
color 边框颜色,如果style='filled’为填充颜色可以用关键字,比如black,也可以用16进制
style filled-进行填充
label node在图中显示的内容
shape node的形状,关键词见下图
fontname 更改字体

创建关系

1
graph.edge('a','b')

画图

1
graph.view()

使用子图对输入节点和输出节点的位置进行规定

参考:python中graphviz中的图节点位置(https://www.codenong.com/34747843/)

1
2
3
4
5
6
7
8
graph = gz.Digraph()
top = gz.Digraph()
top.graph_attr.update(rank='min')
# 将输入节点添加到top中,其余节点添加到graph中,edge的创建则依然在graph中创建
# ···略去一些添加节点和边步骤
# 然后将s加入到graph的子图中即可
graph.subgraph(s)
graph.view()

如果要输出节点也对其的话只需要再添加一个子图,rank设为max即可。但注意这可能并没有解决所有图的对其问题,如果有更多的行/列需要对齐呢?

附录

graphviz所有的属性 见 (https://www.cnblogs.com/Zzbj/p/11431015.html)

基础教程 见 (https://www.jb51.net/article/174842.htm)