一、为啥用Graphviz?

最近接触一个项目需要根据数据自动生成持股关系较为复杂的股权关系图,之所以说复杂主要体现在股权层级多,还有一些特殊持股方式,比如一个子公司在集团内有多家公司持股,还有相互持股等情况,这些情况用Visio等常规手动绘图工具就不好用了。
Graphviz (Graph Visualization Software) 是一个由AT&T实验室启动的开源工具。她使用DOT语言来描述图形的节点、连线及属性等,可以大大减少手绘图形调整图形格式的时间,而将主要精力放在图形的逻辑关系上。而且可以根据需要设置生成图像的格式,如PDF、JPG等。
用Python调用主要因为可以方便地进行迭代等数据处理,从而实现根据数据自动生成图像。

二、在Python中安装Graphviz库

pip install graphviz

三、安装并配置Graphviz

光是在Python中安装了Graphviz库还不能画图,必须要安装Graphviz这个工具并在Windows系统中把bin文件夹的路径加入到环境变量path里。
1、Graphviz官网安装包(msi)地址:https://graphviz.gitlab.io/_pages/Download/Download_windows.html
2、关于如何配置环境变量可以参考这篇文章:
https://zhuanlan.zhihu.com/p/35639711

四、DOT语法

Python中调用DOT语法比较简单,可以参考:
1、官方文档(英文):
https://graphviz.readthedocs.io/en/stable/manual.html
2、一些节点、连线的字体、形状、颜色等属性参数的设置可以参考这篇文章:
python graphviz的使用(画图工具)https://blog.csdn.net/weixin_30314813/article/details/101197728

五、代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-from graphviz import Digraph
#下面L中为需要填写的数据,字段分别为“序号”、“父单位”、“父单位层级”、“子单位”、“子单位层级”、“父单位持股比例 ”,可以填在excel中后,用百度的Echarts表格工具转换为该格式
L=[[1, 'A公司', 1, 'B1公司', 2, '70.00%'],[2, 'A公司', 1, 'B2公司', 2, '50.00%'],[3, 'A公司', 1, 'B3公司', 2, '40.00%'],[4, 'B1公司', 2, 'C1公司', 3, '10.00%'],[5, 'B1公司', 2, 'C2公司', 3, '20.00%'],[6, 'B1公司', 2, 'C3公司', 3, '30.00%'],[7, 'B2公司', 2, 'C3公司', 3, '40.00%'],[8, 'B2公司', 2, 'C4公司', 3, '35.00%'],[9, 'B3公司', 2, 'C4公司', 3, '20.00%'],[10, 'B3公司', 2, 'C5公司', 3, '30.00%'],[11, 'C4公司', 3, 'C5公司', 3, '30.00%'],[12, 'C5公司', 3, 'B1公司', 2, '10.00%']
]
dic={}
father_name_list=[]
child_name_list=[]
equity_portion_list=[]
for i1 in range(len(L)):M=L[i1]father_name=M[1]father_name_list.append(M[1])father_layer=M[2]child_name=M[3]child_name_list.append(M[3])child_layer=M[4]equity_portion=M[5]equity_portion_list.append(M[5])for x in father_name:dic[father_name]=father_layer   #生成父单位名称和对应的层级(用字典考虑去重)for y in child_name:dic[child_name]=child_layer     #将子单位名称和对应的层级也添加到字典中name_layer_list = sorted(dic.items(), key=lambda x: x[1]) #对字典按值(value)进行排序(默认由小到大)u=[]
for z in name_layer_list:company_name=z[0]layer=z[1]u.append(z[1])
number_of_layers=max(u) #计算出层数#按各公司的层数生产分层的节点:
g=Digraph(name='复杂股权结构图')for key in dic:for n in range(number_of_layers+1):if dic[key]==n:with g.subgraph() as layer_n:layer_n.attr(rank='same')layer_n.node(name=key,color='blue',shape='box',fontname='Microsoft YaHei')#生产各节点间的连线:
for i2 in range(len(L)):g.edge(father_name_list[i2],child_name_list[i2],label=equity_portion_list[i2],color='red',fontname='Microsoft Yahei')g.view()

六、操作步骤

代码中需要的数据L可以按以下模板在Excel中填好后,用百度的Echarts表格工具转换为JavaScript格式(偷个懒,没有写Python调用Excel的模块)。
1、先按如下Excel模板填入股权数据:

2、再用百度Echarts的表格工具装换成JavaScript格式后替代代码中的L部分:

3、运行代码

七、结果

运行代码后自动生成如下PDF、JPG等图像:

八、待优化事项

节点之间生成的连线有些为曲线,在公司较多时不太美观,用折线要好看些。如果不用Python调用,直接用Graphviz画才能将图属性设置为splines=“line"或者"ortho”(强制边缘是直的,没有曲线或角度折线),但是Python的Graphviz貌似没有这个属性可以设置,我还要再研究研究。
Graphviz官方文档:http://graphviz.org/doc/info/attrs.html

用Python调用Graphviz生成复杂股权关系图相关推荐

  1. c语言调用graphviz_c语言分析函数调用关系图(call graph)的几种方法

    一.基于 Doxygen或 lxr 的API形式的文档系统. 二.基于CodeViz, CodeViz是<Understanding The Linux Virtual Memory Manag ...

  2. linux系统上使用Python调用C++生成的.so动态链接库opencv

    从环境配置开始,做一些参考链接,我是根据这些链接调试成功的. 在新服务器172.16.5.143的操作记录,CentOS 生成.so文件:ubuntu下将c++转换为so文件并利用python调用 - ...

  3. python 调用 c 生成数组_python调用c++传递数组的实例

    如下所示: input = c_int * 4 # 实例化一个长度为2的整型数组 input = input() # 为数组赋值(input这个数组是不支持迭代的) input[0] = 11 inp ...

  4. python调用graphviz中文乱码_Python-Graphviz

    一.graphviz安装及配置 二.graphviz的使用 graphviz 有两种图,一种是无向图 graph ,边用 -- 连接:一种是有向图 digraph ,边用 -> 连接 官网API ...

  5. mysql设置外键并一键生成数据表关系图

    文章目录 1.概念 2.理解 3.添加外键时需要注意的规则 4.navicat for mysql中设置外键 5.数据表关系图的创建 1.概念 主键是能确定一条记录的唯一标识. 外键用于与另一张表的关 ...

  6. Python数据可视化 Pyecharts 制作 Graph 关系图

    大家好,我是Mr数据杨.今天我们要聊聊的是Python中的关系图模块,就像三国演义中的繁复人物关系网一样. 来看看这个"基本设置"部分.比如要描述刘备与关羽.张飞的结义兄弟之情,那 ...

  7. 快速生成 MySQL 数据库关系图

    需求描述: 在公司老旧系统里,数据库表很多,但是在设计之初并没有建立好关系图,导致新人刚入职,面对N个库,每个库几百张表,很不方便. 例如:公司某一个系统的库有三百张表,在不熟悉项目的情况下,打开数据 ...

  8. 居然还有人不知道如何在 IDEA 中生成 Maven 依赖关系图?

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

  9. python调用git生成log文件_python解析git log后生成页面显示git更新日志信息

    使用git log可以查到git上项目的更新日志. 如下两个git项目,我想把git的日志信息解析成一个便于在浏览器上查看的页面. https://github.com/gityf/lua https ...

最新文章

  1. 固定table标题头、标题列(兼容多种浏览器)
  2. 报错:selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This versio
  3. 计算机编码发明者,“自然码”的发明者周志农在从计算机*毕业后的,才有了第一只...
  4. Matplotlib 三维图像 API
  5. HTML5客户端数据存储机制Web Storage和Web SQL Database
  6. 在Visual C#中用ListView显示数据记录
  7. structs 中过滤器问题
  8. 12C RAC重装无法识别磁盘组(AFD新特性)
  9. 转回到Edison上开发
  10. 瑞幸突击2018,一场互联网向咖啡发起的进攻 | 一点财经
  11. THREEJS相关3d-force-graph 3d力导图使用
  12. 算法笔记.胡凡 第五章 数学问题
  13. 给力文:网络营销就像娶美女做老婆(转)
  14. burpsuit 抓取https包,证书问题,此证书已在此前安装为一个证书权威机构
  15. 计算机网络——常考的面试题
  16. JAVA方法SQL语句执行顺序
  17. 我看世界杯——来自一个“假”球迷视角
  18. Qt自定义控件之仪表盘的完整实现
  19. 《时代》2022年全球最具影响力100家公司榜单公布,防弹少年团、亚马逊新CEO登上封面 | 美通社头条...
  20. 根据关键字选出excel中匹配的数据

热门文章

  1. RedisCluster如何高效率地批量插入数据
  2. 免费送!!!CSDN 会员月卡!
  3. JAVA中创建线程的三种方法及比较
  4. Anaconda打开多个spyder窗口
  5. Spark安装-环境搭建
  6. C++学习日记7——容器
  7. 运用css+html制作简单的淘宝轮播案例图
  8. Qt绘制旋转的轮播图
  9. Linux 打包可执行文件
  10. MySQL数据库实操教程(23)——数据库备份与还原