通常我们使用graphviz这个包来协助绘制流程图或决策树的可视化,免费graphviz-2.38.msi下载地址:https://download.csdn.net/download/weixin_42213421/12739476
下载完成后,通过以下语句将包加载进来:
from graphviz import Digraph
# 写明graphviz的bin文件目录
os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'
一、绘制流程图
现有数据集如下所示:
其中:
pnode:表示父节点
node:表示父节点下的子节点
gap/gap_rate:表示目标差值
edge:表示边关系
lv:lever表示层级
通过以上数据集,我要绘制如下所示流程图:
实现方式如下:
# 实例化一个Digraph对象(有向图),name:生成的图片的图片名,format:生成的图片格式
dot= Digraph(name="G",format="png")
将所有列的数据都转成list格式
node_list = data1['node'].tolist()
gap_list=data1['gap'].tolist()
gap_rate_list=data1['gap_rate'].tolist()
edge_list=data1['edge'].tolist()
lv_list=data1['lv'].tolist()
# dot.node定义节点名称,name:这个节点对象的名称,label:节点名,color:画节点的线的颜色
#fontname:防止字体乱码情况
for i in range(len(node_list)):
if gap_rate_list[i]>0.5:
dot.node(name=edge_list[i].split('->')[1]+"|"+edge_list[i].split('->')[0],
label=node_list[i]+'\n'+"Gap:{:.2f}K".format(gap_list[i]/1000),
color="lightsalmon",
style = "filled",
fontname="Microsoft YaHei")
else:
dot.node(name=edge_list[i].split('->')[1]+"|"+edge_list[i].split('->')[0],
label=node_list[i]+'\n'+"Gap:{:.2f}K".format(gap_list[i]/1000),
color="peachpuff",
style = "filled",
fontname="Microsoft YaHei")
节点定义好之后,对各个节点添加边关系:
# add edges 1-4层
for i in range(len(node_list)):
target_list=edge_list[i].split('->')[1]+"|"+edge_list[i].split('->')[0]
# add edge 第一层
if lv_list[i]==1 and "ROOT" in target_list:
dot.edge('total_gap',target_list)
# add edge 第二层
for j in range(len(node_list)):
temp_list=edge_list[j].split('->')[1]+"|"+edge_list[j].split('->')[0]
if lv_list[i]==2 and lv_list[j]==1 and (target_list.split("|")[1] == temp_list.split("|")[0]) :
dot.edge(temp_list,target_list)
# add edge 第三层
if lv_list[i]==3 and lv_list[j]==2 and gap_rate_list[j]>0.1 and (target_list.split("|")[1] == temp_list.split("|")[0]):
dot.edge(temp_list,target_list)
# add edge 第四层
if lv_list[i]==4 and lv_list[j]==3 and gap_rate_list[j]>0.1 and (target_list.split("|")[1] == temp_list.split("|")[0]):
dot.edge(temp_list,target_list)
绘图:
# filename:图片的名称,若无filename,则使用Digraph对象的name,默认会有gv后缀
# directory:图片保存的路径,默认是在当前路径下保存
dot.view(filename="水果零食业绩归因", directory="D:\MyTest")
打印生成的源代码:
print(dot.source)
使用node()和edge()或edges()方法将节点和边添加到图形对象:
- Digraph():实例化一个图形对象
- node():方法第一个参数是name,第二个参数是label,即node画节点
edges():
方法可以一次添加多个边, 每个边用字符串表示, 比如cb
表示从 c 到 b 的边,即edges画边edge():
方法一次添加一个边- view():把图形画出来,并自动显示图片(弹出来),一般使用view()进行调试
- render():把图形画出来,一般使用render保存图片的时候,view=False(不弹出图片)
版权声明:本文为qq_41127332原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。