数据结构可视化 Graphviz在Python中的使用 [树的可视化]

简介: 数据结构可视化 Graphviz在Python中的使用 [树的可视化]

1. Graphviz 相关介绍

1.1 安装

安装直接在shell里面pip就好了,代码如下:

pip install graphviz

一个例子:

from graphviz import Digraph, Graph
g = Graph(engine='dot',
         node_attr={'shape': 'egg'},
         )
g.edge('hello1', 'hello2', label='l')
g.edge('hello1', 'hello3', label='r')
g.edge('hello2', 'hello4', label='l')
g.edge('hello2', 'hello5', label='r')
g.view()

1.2 有向图和无向图

有向图:graphviz.Digraph() edge 有向图

无向图:graphviz.Graph() edge 无向图

Digraph和Graph参数都是一样的,其中:

name: graphviz源码的文件名 即name.gv

comment: graphviz源码的comment,在源码的第一行

filename: graphviz源码的文件名 即filename

directory: 保存graphviz源码的文件夹

format: 文件格式 bmp, canon, cgimage, cmap, cmapx, cmapx_np, dot, dot_json, eps, exr, fig, gd, gd2, gif, gtk, gv, ico, imap, imap_np, ismap, jp2, jpe, jpeg, jpg, json, json0, pct, pdf, pic, pict, plain, plain-ext, png, pov, ps, ps2, psd, sgi, svg, svgz, tga, tif, tiff, tk, vml, vmlz, vrml, wbmp, webp, x11, xdot, xdot1.2, xdot1.4, xdot_json, xlib

engine: 布局 circo, dot, fdp, neato, osage, patchwork, sfdp, twopi

encoding: 源码保存的编码

graph_attr: 图属性

node_attr: 点属性

edge_attr: 边属性

1.3 node 属性

node_attr = {‘shape’: ‘box’}

node_attr = {‘fontname’: ‘SimHei’}

  • 黑体:SimHei
  • 宋体:SimSun
  • 新宋体:NSimSun
  • 仿宋:FangSong
  • 楷体:KaiTi

1.4 edge 属性

edge_attr = {‘arrowhead’: ‘rnormal’}

待更新

2. 数据结构可视化

2.1 画树

利用Graphviz画树,代码如下:

from graphviz import Digraph
class Node:
    def __init__(self, number, val=None, name=None, left=None, right=None):
        """number 必须要保证每个结点都是独一无二的,其他属性都可以 可存在可不存在"""
        self.number = number
        self.val = val
        self.name = name
        self.left = left
        self.right = right
def plot_tree(root):
    g = Digraph(
      format='png',
        engine='dot',
        node_attr={
            'shape': 'egg',
            'fontname': 'SimHei'
        },
        edge_attr={'arrowhead': 'normal'},
    )
    def dfs(g, node, parent=None, where=None):
        if not node:
            return
        if node and parent:
          # 如果 有name就以name为标签,没有name就以{number:val}表示标签
            name1 = parent.name if parent.name else str(parent.number) + f':{parent.val}'
            name2 = node.name if node.name else str(node.number) + f':{node.val}'
            # label 表示是否标记左or右
            g.edge(name1, name2, label=where)
        dfs(g, node.left, node, where='l')
        dfs(g, node.right, node, where='r')
    
    dfs(g, root)
    g.view()

使用方法如下:

plot_tree(root)


目录
相关文章
|
1月前
|
算法 Java Python
使用Python来绘制樱花树
本文以林徽因的《你是人间的四月天》为引,将春日意象与现代职场编程艺术结合,通过Python的Turtle模块绘制分形树和花瓣图案。文章详细解析了Turtle模块的使用方法、递归算法及随机性在图形生成中的应用,展示了如何用代码创造自然美感。核心代码包含tree函数(绘制分形树)和petal函数(绘制花瓣),最终生成一幅生动的春日画卷。项目不仅帮助读者掌握Turtle绘图技巧,更激发对编程艺术的兴趣,鼓励探索数字世界的无限可能。
70 5
|
1月前
|
数据采集 数据可视化 数据挖掘
基于Python的App流量大数据分析与可视化方案
基于Python的App流量大数据分析与可视化方案
|
2月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
77 3
 算法系列之数据结构-Huffman树
|
2月前
|
存储 自然语言处理 数据库
【数据结构进阶】AVL树深度剖析 + 实现(附源码)
在深入探讨了AVL树的原理和实现后,我们不难发现,这种数据结构不仅优雅地解决了传统二叉搜索树可能面临的性能退化问题,还通过其独特的平衡机制,确保了在任何情况下都能提供稳定且高效的查找、插入和删除操作。
137 19
|
2月前
|
存储 人工智能 索引
Python数据结构:列表、元组、字典、集合
Python 中的列表、元组、字典和集合是常用数据结构。列表(List)是有序可变集合,支持增删改查操作;元组(Tuple)与列表类似但不可变,适合存储固定数据;字典(Dictionary)以键值对形式存储,无序可变,便于快速查找和修改;集合(Set)为无序不重复集合,支持高效集合运算如并集、交集等。根据需求选择合适的数据结构,可提升代码效率与可读性。
|
2月前
|
数据可视化 前端开发 数据挖掘
使用Folium在Python中进行地图可视化:全面指南
Folium是基于Python的交互式地图可视化库,依托Leaflet.js实现地理空间数据展示。本文从安装、基础使用到高级功能全面解析Folium:包括创建地图、添加标记、保存文件,以及绘制热力图、多边形和Choropleth地图等高级操作。通过展示北京市景点与全球地震数据的实际案例,结合性能优化、自定义样式和交互性增强技巧,帮助用户掌握Folium的核心功能与应用潜力,为数据分析提供直观支持。
114 2
|
5月前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
157 66
|
4月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
142 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
4月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
118 12
|
4月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
107 10