热线电话:13121318867

登录
首页大数据时代【CDA干货】Pyplot树状图:层级数据可视化的技术实现与业务应用
【CDA干货】Pyplot树状图:层级数据可视化的技术实现与业务应用
2025-11-17
收藏

数据可视化领域,树状图(Tree Diagram)是呈现层级结构数据的核心工具——无论是电商商品分类、企业组织架构,还是数据挖掘中的决策树模型结果,都需要通过树状图将“父-子”关联关系直观化。matplotlib.pyplot(简称pyplot)作为Python最经典的可视化库,凭借灵活的参数配置和良好的兼容性,成为实现树状图的主流选择。本文将从技术本质、核心价值、实操步骤、进阶优化到业务落地,完整解析pyplot树状图的应用逻辑,附可直接运行的代码案例与场景适配方案。

一、技术定位:Pyplot树状图是什么?

要掌握pyplot树状图,需先明确其技术本质与核心特性——它并非单一“树状图函数”的直接调用,而是通过pyplot的基础绘图函数(如barhplot)构建层级关系,实现“数据层级→视觉层级”的转化。

1. 核心定义:层级数据的可视化载体

Pyplot树状图是基于matplotlib.pyplot库实现的层级数据可视化组件,核心是将“具有父子关联的结构化数据”(如“大类→中类→小类”的商品分类)转化为“横向/纵向分支结构”的图形,其中:

  • “节点”:代表层级中的一个数据单元(如“家电”“智能手机”);

  • “分支”:连接父节点与子节点的线条,体现关联关系;

  • “层级深度”:通过节点的缩进、位置或颜色区分(如一级节点左对齐,二级节点缩进20px)。

与专业树状图工具(如Graphviz)相比,pyplot的优势在于“无需额外依赖、可与Python数据生态(Pandas、NumPy)无缝衔接”,尤其适合需要嵌入数据分析流程的场景。

2. 技术核心:基于坐标系统的层级布局

Pyplot本身没有专门的“tree”函数,树状图的实现本质是手动定义节点坐标,通过基础图形组合完成:

  • 横向树状图:用barh(水平条形图)绘制节点,用plot绘制连接线条,层级深度通过x轴坐标控制;

  • 纵向树状图:用bar(垂直条形图)绘制节点,层级深度通过y轴坐标控制;

  • 决策树树状图:结合Rectangle(矩形)和线条,呈现分支条件与结果节点。

这种“基础函数组合”的特性,让pyplot树状图具备极高的灵活性——可按需定制节点样式、分支颜色、标签字体,完全适配业务可视化需求。

二、核心价值:为什么用Pyplot实现树状图

Python可视化生态中,虽有NetworkX、Plotly等库可实现树状图,但pyplot仍占据重要地位,核心价值体现在三个维度:

1. 数据兼容性强:无缝对接Python数据栈

Pyplot树状图可直接读取Pandas DataFrame、NumPy数组等常用数据格式,无需复杂的数据转换。例如,电商商品分类数据(存于DataFrame)可直接提取“父分类、子分类、数值”字段,用于树状图绘制,避免跨工具数据传递的麻烦。

2. 样式定制自由:满足业务可视化规范

企业级可视化常需符合品牌规范(如特定颜色、字体),pyplot支持精细化样式控制:节点颜色可关联业务指标(如销量高的分类用红色,低的用蓝色),标签字体可匹配品牌字体,分支线条可调整粗细与透明度,远超Excel、Tableau等工具的固定样式。

3. 轻量无依赖:嵌入分析流程更高效

Pyplot是matplotlib的核心模块,几乎是Python数据分析环境的“标配”,无需额外安装库。在数据挖掘项目中,可直接在决策树模型训练完成后,用pyplot绘制树状图展示决策路径,形成“数据处理→模型训练→结果可视化”的闭环,提升分析效率。

三、实操指南:Pyplot树状图的实现步骤(从基础到进阶)

基于pyplot的树状图实现,按“数据复杂度”分为“基础层级树”“进阶样式树”“决策树可视化”三类场景,以下附完整代码与步骤解析。

场景1:基础横向树状图(企业组织架构)

核心需求:展示“公司→部门→小组”的三级架构,清晰区分层级,标注各小组人数。

步骤1:数据准备(层级结构定义)

用字典定义层级关系,键为“父节点”,值为“子节点列表+对应数值”:


import matplotlib.pyplot as plt
import numpy as np

# 1. 定义组织架构数据(三级层级:公司→部门→小组)
org_data = {
    "某科技公司": [  # 一级节点
        ("技术部", [("算法组"15), ("开发组"20), ("测试组"10)]),  # 二级节点+三级节点
        ("业务部", [("电商组"25), ("金融组"18)]),
        ("职能部", [("人力组"8), ("财务组"6)])
    ]
}

步骤2:计算节点坐标(核心逻辑)

通过递归遍历层级数据,计算每个节点的x(层级深度)、y(垂直位置)坐标,确保节点不重叠:


def calculate_coords(data, x_base=0, y_base=0, level=1, coords=None):
    """
    递归计算节点坐标
    x_base: 一级节点x坐标
    y_base: 初始y坐标
    level: 层级(1=一级,2=二级,3=三级)
    coords: 存储坐标的字典
    """

    if coords is None:
        coords = {"nodes": [], "connections": []}  # nodes: (x, y, label, value); connections: (x1,y1,x2,y2)
    x = x_base + (level - 1) * 1.5  # 层级越深,x越大(横向树状图
    child_count = sum([len(children) if isinstance(children[0], tuple) else 1 for _, children in data.items()])
    y_step = 8 / child_count  # 垂直方向步长,避免节点重叠
    current_y = y_base - 4  # 初始y位置(居中)
    
    for parent, children in data.items():
        # 处理父节点(一级/二级)
        if level == 1:
            parent_value = sum([v for _, sub_children in children for _, v in sub_children])
        else:
            parent_value = sum([v for _, v in children])
        coords["nodes"].append((x, current_y, parent, parent_value))
        
        # 处理子节点
        for child in children:
            if level == 2:  # 二级节点的子节点是三级节点
                child_label, child_value = child
                child_x = x + 1.5
                child_y = current_y
                coords["nodes"].append((child_x, child_y, child_label, child_value))
                # 记录父-子连接关系
                coords["connections"].append((x, current_y, child_x, child_y))
                current_y += y_step
            else:  # 一级节点的子节点是二级节点,递归处理
                child_label, child_grand = child
                child_x = x + 1.5
                child_y = current_y
                coords["nodes"].append((child_x, child_y, child_label, sum([v for _, v in child_grand])))
                coords["connections"].append((x, current_y, child_x, child_y))
                # 递归计算三级节点坐标
                calculate_coords({child_label: child_grand}, x_base, current_y, level+1, coords)
                current_y += y_step * len(child_grand)
    return coords

# 计算坐标
coords = calculate_coords(org_data)

步骤3:用Pyplot绘制树状图

barh绘制节点(水平条形图),用plot绘制连接线条,添加标签与数值:


# 设置画布大小
plt.figure(figsize=(128))
plt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题

# 1. 绘制连接线条(先画线条,避免覆盖节点)
for (x1, y1, x2, y2) in coords["connections"]:
    plt.plot([x1+0.4, x2-0.4], [y1, y2], color='#999999', linewidth=1)  # 线条连接节点边缘

# 2. 绘制节点(按层级区分颜色)
colors = {1'#4A90E2'2'#50E3C2'3'#F5A623'}  # 一级=蓝,二级=绿,三级=橙
for (x, y, label, value) in coords["nodes"]:
    level = int((x - 0) / 1.5) + 1  # 根据x坐标判断层级
    # 绘制水平条形节点
    bar = plt.barh(y, width=0.8, left=x, height=0.6, color=colors[level], alpha=0.8)
    # 添加标签(节点名称+人数)
    plt.text(x + 0.4, y, f"{label}n({value}人)", ha='center', va='center', fontsize=10, fontweight='bold')

# 3. 调整图形样式
plt.xlim(06)  # x轴范围
plt.ylim(-55)  # y轴范围
plt.axis('off')  # 隐藏坐标轴
plt.title("某科技公司组织架构树状图", fontsize=16, fontweight='bold', pad=20)

# 保存图片
plt.tight_layout()
plt.savefig("org_tree.png", dpi=300, bbox_inches='tight')
plt.show()

结果说明:

生成的横向树状图中,一级节点(公司)、二级节点(部门)、三级节点(小组)通过颜色和位置区分,线条清晰连接父子关系,标签标注了小组人数,完全满足组织架构展示需求。

场景2:进阶决策树可视化(数据挖掘结果)

核心需求:将sklearn训练的决策树模型(预测用户购买意愿)用pyplot树状图展示,标注分支条件与预测结果。

核心代码(模型训练+树状图绘制):


from sklearn.tree import DecisionTreeClassifier, export_text
import matplotlib.pyplot as plt
import pandas as pd

# 1. 准备数据并训练决策树
data = pd.DataFrame({
    "浏览时长(分)": [105203258152],
    "是否加购": [10101100],
    "是否购买": [10101010]
})
X = data[["浏览时长(分)""是否加购"]]
y = data["是否购买"]
dt = DecisionTreeClassifier(max_depth=2)  # 限制树深度为2,便于可视化
dt.fit(X, y)

# 2. 提取决策树结构(节点信息)
tree_structure = export_text(dt, feature_names=list(X.columns))
print("决策树结构:n", tree_structure)

# 3. 定义决策树节点坐标与绘制函数
def plot_decision_tree(dt, feature_names, class_names):
    plt.figure(figsize=(106))
    plt.rcParams['font.sans-serif'] = ['SimHei']
    
    # 递归绘制树节点
    def recurse(node, x, y, width):
        # 节点信息
        if dt.tree_.children_left[node] == dt.tree_.children_right[node]:  # 叶子节点
            class_idx = dt.tree_.value[node].argmax()
            plt.rectangle((x-width/2, y-0.2), x+width/2, y+0.2
                          facecolor='#F5A623', edgecolor='black')
            plt.text(x, y, f"预测:{'购买' if class_names[class_idx] == 1 else '不购买'}n样本数:{dt.tree_.n_node_samples[node]}"
                     ha='center', va='center', fontsize=9)
            return
        # 内部节点(分支条件)
        feature_idx = dt.tree_.feature[node]
        threshold = dt.tree_.threshold[node]
        plt.rectangle((x-width/2, y-0.2), x+width/2, y+0.2
                      facecolor='#4A90E2', edgecolor='black')
        plt.text(x, y, f"{feature_names[feature_idx]}{threshold:.1f}?n样本数:{dt.tree_.n_node_samples[node]}"
                 ha='center', va='center', fontsize=9, fontweight='bold')
        
        # 绘制左分支(满足条件)
        left_node = dt.tree_.children_left[node]
        plt.plot([x, x-width/2], [y-0.2, y-0.8], color='black', linewidth=1)
        plt.text(x-width/4, y-0.5"是", ha='center', va='center')
        recurse(left_node, x-width/2, y-1, width/2)
        
        # 绘制右分支(不满足条件)
        right_node = dt.tree_.children_right[node]
        plt.plot([x, x+width/2], [y-0.2, y-0.8], color='black', linewidth=1)
        plt.text(x+width/4, y-0.5"否", ha='center', va='center')
        recurse(right_node, x+width/2, y-1, width/2)
    
    # 开始绘制(根节点在顶部)
    recurse(00.50.90.8)
    plt.xlim(01)
    plt.ylim(-1.51.2)
    plt.axis('off')
    plt.title("用户购买意愿预测决策树", fontsize=14, fontweight='bold')
    plt.savefig("decision_tree.png", dpi=300, bbox_inches='tight')
    plt.show()

# 4. 绘制决策树
plot_decision_tree(dt, feature_names=list(X.columns), class_names=[01])

结果说明:

树状图清晰展示了决策树的分支逻辑——以“浏览时长≤12.5分?”“是否加购≤0.5?”为条件,最终输出“购买”或“不购买”的预测结果,节点标注了样本数量,帮助业务人员快速理解用户购买的判断依据。

四、业务应用场景:Pyplot树状图的落地价值

Pyplot树状图的核心优势是“适配层级数据的多样化场景”,在电商、金融、企业管理等领域均有广泛应用,典型场景如下:

1. 电商零售:商品分类与销量展示

将“大类→中类→小类”的商品结构与销量结合,用树状图展示:一级节点为“家电”“服饰”等大类,二级为“智能手机”“连衣裙”等中类,三级为具体商品;节点颜色深度对应销量高低,帮助运营快速识别高销量商品所在层级,优化库存分配。

2. 金融风控:客户分层与风险等级

基于客户“资产规模→信用评分→历史违约记录”构建层级树,节点标注风险等级(低/中/高),用红色标注高风险客户所在分支,为风控人员提供直观的客户风险画像,辅助贷款审批决策。

3. 数据挖掘:模型结果解释

决策树外,pyplot树状图还可用于展示聚类结果的层级关系(如层次聚类树状图)、关联规则的推导路径,帮助数据分析师向非技术人员解释模型逻辑,降低沟通成本。

4. 项目管理:任务分解与进度跟踪

将“项目→阶段→任务→子任务”用树状图展示,节点标注完成率(如“80%”),用绿色表示已完成、黄色表示进行中、红色表示延期,让项目负责人清晰掌握任务推进情况。

五、避坑指南:Pyplot树状图的常见问题与解决方案

1. 问题1:节点重叠或位置混乱

  • 原因:坐标计算未考虑节点数量,垂直/水平步长设置不合理;

  • 解决方案:根据子节点数量动态调整步长(如“总高度/子节点数”),层级越深步长越小;用递归函数统一管理坐标计算,避免手动赋值误差。

2. 问题2:中文标签显示乱码

  • 原因:pyplot默认字体不支持中文;

  • 解决方案:添加字体配置代码:plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans'],同时设置英文备用字体。

3. 问题3:复杂层级(≥4级)展示模糊

  • 原因:层级过深导致横向/纵向空间不足,节点挤压;

  • 解决方案:① 采用“折叠树”逻辑,默认展示前3级,点击展开深层节点(需结合交互库如mpl_toolkits);② 调整画布大小(如figsize=(15, 10)),缩小节点高度/宽度,增加层级间距。

4. 问题4:数据更新后树状图需重复修改代码

  • 原因:坐标计算与数据强耦合,未封装通用函数;

  • 解决方案:将坐标计算、绘图逻辑封装为通用函数(如plot_tree(data, direction='horizontal')),数据更新时仅需传入新的层级数据,无需修改绘图代码。

六、总结:Pyplot树状图的核心优势与未来拓展

Pyplot树状图并非“开箱即用”的工具,但其“基础函数组合+高度定制化”的特性,使其成为Python生态中处理层级数据可视化的核心选择。其核心优势可概括为:

  • 灵活可控:从节点样式到分支线条,全流程可定制,适配各类业务规范;

  • 生态融合:与Pandas、sklearn等工具无缝衔接,嵌入数据分析流程更高效;

  • 成本极低:无需额外安装依赖,Python数据分析环境默认支持。

未来拓展方向:结合交互库(如mpl_toolkits.mplot3d实现3D树状图、ipywidgets实现节点点击展开),提升树状图的交互性;结合颜色映射(cmap)实现节点与业务指标的深度关联,让可视化不仅“好看”更“有用”。

对于数据可视化从业者而言,掌握pyplot树状图的核心是“理解层级数据的坐标映射逻辑”——只要能将数据层级转化为合理的坐标系统,就能通过基础函数组合出满足业务需求的树状图,成为数据分析结果呈现的有力工具。

推荐学习书籍 《CDA一级教材》适合CDA一级考生备考,也适合业务及数据分析岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~ !

免费加入阅读:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0

数据分析师资讯
更多

OK
客服在线
立即咨询
客服在线
立即咨询