【Tools】一个绘制决策树的工具——graphviz,但你忽视了它的其他功能!

2024-02-03 09:59

本文主要是介绍【Tools】一个绘制决策树的工具——graphviz,但你忽视了它的其他功能!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要: 数据可视化一直各行各业的一个重点,除了matplotlib之外,还可以使用graphviz软件绘制流程图,决策树等图形,并且还可以扩展到更多的图形,如结构句法树等,大脑风暴吧。

关键词: 数据可视化,graphviz

前言

数据可视化一直各行各业的一个重点。在机器学习中,常规的数据可视化使用matplotlib包就基本可以解决了,如果还不够的话可以使用seaborn进行补充。但是对于决策树算法以及一些集成算法来说matplotlib就显得力不从心了。人们就开始选择其他工具显示相关数据了,到目前为止我所知的就是Graphviz了。

1 Graphviz简介

Graphviz是开源的图形可视化软件。它有几个主要的图形布局程序。它还具有Web和交互式图形界面,以及辅助工具,库和语言绑定。Graphviz布局程序以简单的文本语言描述图形,并以几种有用的格式制作图形,例如用于网页的图像和SVG,用于PDF或其他文档。或在交互式图形浏览器中显示。 (Graphviz还支持XML方言GXL。)Graphviz具有用于具体图表的许多有用功能,例如颜色,字体,表格节点布局,线型,超链接和自定义形状的选项。

2 安装与环境配置

1.软件下载与环境配置: https://www.graphviz.org/download/,该软件支持Linux、Mac、Windows系统,可根据自己的电脑选择安装。环境就是就bin目录配置环境变量(path里)即可。

2.Python包安装 : 安装graphviz模块 pip install graphvize

3 决策树绘制

绘制一个决策树的案例如下:

from imageio import imread
import matplotlib.pyplot as plt
import graphviz# 创建树对象
mygraph = graphviz.Digraph(node_attr={'shape': 'box'},edge_attr={'labeldistance': "10.5"},format="png")
# 构建节点
mygraph.node("0", "Has feathers?")
mygraph.node("1", "Can fly?")
mygraph.node("2", "Has fins?")
mygraph.node("3", "Hawk")
mygraph.node("4", "Penguin")
mygraph.node("5", "Dolphin")
mygraph.node("6", "Bear")# 构建边
mygraph.edge("0", "1", label="True")
mygraph.edge("0", "2", label="False")
mygraph.edge("1", "3", label="True")
mygraph.edge("1", "4", label="False")
mygraph.edge("2", "5", label="True")
mygraph.edge("2", "6", label="False")
# 渲染
mygraph.render("decisionTree")# 图形显示
ax = plt.gca()                # 获取图形坐标轴
ax.imshow(imread("decisionTree.png"))  # 读取生成的图片
ax.set_axis_off()             # 图形不嫌弃是坐标
plt.show()                    # 显示图形

最后会生成一个decisionTree.png决策树图片如下:

从上图可以看出图片不是很清晰,我们可以生成其他高清矢量图格式,如svg、pdf等。在创建树对象时,设置format=“pdf”,即可,主要代码如下:

mygraph = graphviz.Digraph(node_attr={'shape': 'box'},edge_attr={'labeldistance': "10.5"},format="pdf")

注: 这时就不要使用matplotlib打开图片了。
pdf高清文件图如下:

4 其他图形拓展

上面绘制了决策树,其实我们也可以拓展绘制结构句法树,这也是比较简单的,

from imageio import imread
import matplotlib.pyplot as plt
import graphvizax = plt.gca()
mygraph = graphviz.Graph(node_attr={'shape': 'none'},edge_attr={'labeldistance': "10.5"},format="pdf")mygraph.node("0", "S")   # 节点
mygraph.node("1", "N")
mygraph.edge("0", "1")   # 边
mygraph.node("2", "小李", fontname="Microsoft YaHei")
mygraph.edge("1", "2")mygraph.node("3", "VP")
mygraph.node("4", "DP")
mygraph.edge("0", "3")
mygraph.edge("3", "4")mygraph.node("5", "D")
mygraph.node("6", "U")
mygraph.edge("4", "5")
mygraph.edge("4", "6")mygraph.node("7", "远远", fontname="Microsoft YaHei")
mygraph.node("8", "地", fontname="Microsoft YaHei")
mygraph.edge("5", "7")
mygraph.edge("6", "8")mygraph.node("9", "VP")
mygraph.edge("3", "9")mygraph.node("10", "V")
mygraph.node("11", "CS")
mygraph.edge("9", "10")
mygraph.edge("9", "11")mygraph.node("12", "看见", fontname="Microsoft YaHei")
mygraph.edge("10", "12")mygraph.node("13", "N")
mygraph.node("14", "VP")
mygraph.edge("11", "13")
mygraph.edge("11", "14")mygraph.node("15", "小王", fontname="Microsoft YaHei")
mygraph.edge("13", "15")mygraph.node("16", "PP")
mygraph.node("17", "V")
mygraph.edge("14", "16")
mygraph.edge("14", "17")mygraph.node("18", "看书", fontname="Microsoft YaHei")
mygraph.edge("17", "18")mygraph.node("19", "P")
mygraph.node("20", "NP")
mygraph.edge("16", "19")
mygraph.edge("16", "20")mygraph.node("21", "在", fontname="Microsoft YaHei")
mygraph.edge("19", "21")mygraph.node("22", "N")
mygraph.node("23", "F")
mygraph.edge("20", "22")
mygraph.edge("20", "23")mygraph.node("24", "草地", fontname="Microsoft YaHei")
mygraph.node("25", "上", fontname="Microsoft YaHei")mygraph.edge("22", "24")
mygraph.edge("23", "25")
mygraph.render("tmp")

绘制结果如下:

总体来说还是可以接受的。当然这个是一个点一个点连的,在实际中则需要利用树这种数据结构的相关算法进行处理,快速绘制处相关图形。
当然还可以绘制其他图形,例如:


这里就不作演示,可以参考官方文档!

总结

Graphviz是开源的图形可视化软件,不仅仅可以绘制决策树,还可以更多的无向图和有向图,Graphviz提供了很多图形供我们组合以及不同的线条,颜色等,可以充分发挥我们的想象去思考如何构建我们图形,例如自动机转换图等。除此之外,Graphviz提供的接口比较多,能够导出的结果也是多种多样,能够满足我们常用的需求。

这篇关于【Tools】一个绘制决策树的工具——graphviz,但你忽视了它的其他功能!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/673796

相关文章

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Python绘制TSP、VRP问题求解结果图全过程

《Python绘制TSP、VRP问题求解结果图全过程》本文介绍用Python绘制TSP和VRP问题的静态与动态结果图,静态图展示路径,动态图通过matplotlib.animation模块实现动画效果... 目录一、静态图二、动态图总结【代码】python绘制TSP、VRP问题求解结果图(包含静态图与动态图

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

录音功能在哪里? 电脑手机等设备打开录音功能的技巧

《录音功能在哪里?电脑手机等设备打开录音功能的技巧》很多时候我们需要使用录音功能,电脑和手机这些常用设备怎么使用录音功能呢?下面我们就来看看详细的教程... 我们在会议讨论、采访记录、课堂学习、灵感创作、法律取证、重要对话时,都可能有录音需求,便于留存关键信息。下面分享一下如何在电脑端和手机端上找到录音功能

使用python制作一款文件粉碎工具

《使用python制作一款文件粉碎工具》这篇文章主要为大家详细介绍了如何使用python制作一款文件粉碎工具,能够有效粉碎密码文件和机密Excel表格等,感兴趣的小伙伴可以了解一下... 文件粉碎工具:适用于粉碎密码文件和机密的escel表格等等,主要作用就是防止 别人用数据恢复大师把你刚删除的机密的文件恢

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv