python用graphviz绘制流程图

通常我们使用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(不弹出图片)
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值