京公网安备 11010802034615号
经营许可证编号:京B2-20210330
在数据可视化领域,树状图(Tree Diagram)是呈现层级结构数据的核心工具——无论是电商商品分类、企业组织架构,还是数据挖掘中的决策树模型结果,都需要通过树状图将“父-子”关联关系直观化。matplotlib.pyplot(简称pyplot)作为Python最经典的可视化库,凭借灵活的参数配置和良好的兼容性,成为实现树状图的主流选择。本文将从技术本质、核心价值、实操步骤、进阶优化到业务落地,完整解析pyplot树状图的应用逻辑,附可直接运行的代码案例与场景适配方案。
要掌握pyplot树状图,需先明确其技术本质与核心特性——它并非单一“树状图函数”的直接调用,而是通过pyplot的基础绘图函数(如barh、plot)构建层级关系,实现“数据层级→视觉层级”的转化。
Pyplot树状图是基于matplotlib.pyplot库实现的层级数据可视化组件,核心是将“具有父子关联的结构化数据”(如“大类→中类→小类”的商品分类)转化为“横向/纵向分支结构”的图形,其中:
“节点”:代表层级中的一个数据单元(如“家电”“智能手机”);
“分支”:连接父节点与子节点的线条,体现关联关系;
“层级深度”:通过节点的缩进、位置或颜色区分(如一级节点左对齐,二级节点缩进20px)。
与专业树状图工具(如Graphviz)相比,pyplot的优势在于“无需额外依赖、可与Python数据生态(Pandas、NumPy)无缝衔接”,尤其适合需要嵌入数据分析流程的场景。
Pyplot本身没有专门的“tree”函数,树状图的实现本质是手动定义节点坐标,通过基础图形组合完成:
这种“基础函数组合”的特性,让pyplot树状图具备极高的灵活性——可按需定制节点样式、分支颜色、标签字体,完全适配业务可视化需求。
在Python可视化生态中,虽有NetworkX、Plotly等库可实现树状图,但pyplot仍占据重要地位,核心价值体现在三个维度:
Pyplot树状图可直接读取Pandas DataFrame、NumPy数组等常用数据格式,无需复杂的数据转换。例如,电商商品分类数据(存于DataFrame)可直接提取“父分类、子分类、数值”字段,用于树状图绘制,避免跨工具数据传递的麻烦。
企业级可视化常需符合品牌规范(如特定颜色、字体),pyplot支持精细化样式控制:节点颜色可关联业务指标(如销量高的分类用红色,低的用蓝色),标签字体可匹配品牌字体,分支线条可调整粗细与透明度,远超Excel、Tableau等工具的固定样式。
Pyplot是matplotlib的核心模块,几乎是Python数据分析环境的“标配”,无需额外安装库。在数据挖掘项目中,可直接在决策树模型训练完成后,用pyplot绘制树状图展示决策路径,形成“数据处理→模型训练→结果可视化”的闭环,提升分析效率。
基于pyplot的树状图实现,按“数据复杂度”分为“基础层级树”“进阶样式树”“决策树可视化”三类场景,以下附完整代码与步骤解析。
核心需求:展示“公司→部门→小组”的三级架构,清晰区分层级,标注各小组人数。
用字典定义层级关系,键为“父节点”,值为“子节点列表+对应数值”:
import matplotlib.pyplot as plt
import numpy as np
# 1. 定义组织架构数据(三级层级:公司→部门→小组)
org_data = {
"某科技公司": [ # 一级节点
("技术部", [("算法组", 15), ("开发组", 20), ("测试组", 10)]), # 二级节点+三级节点
("业务部", [("电商组", 25), ("金融组", 18)]),
("职能部", [("人力组", 8), ("财务组", 6)])
]
}
通过递归遍历层级数据,计算每个节点的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)
用barh绘制节点(水平条形图),用plot绘制连接线条,添加标签与数值:
# 设置画布大小
plt.figure(figsize=(12, 8))
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(0, 6) # x轴范围
plt.ylim(-5, 5) # 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()
生成的横向树状图中,一级节点(公司)、二级节点(部门)、三级节点(小组)通过颜色和位置区分,线条清晰连接父子关系,标签标注了小组人数,完全满足组织架构展示需求。
核心需求:将sklearn训练的决策树模型(预测用户购买意愿)用pyplot树状图展示,标注分支条件与预测结果。
from sklearn.tree import DecisionTreeClassifier, export_text
import matplotlib.pyplot as plt
import pandas as pd
# 1. 准备数据并训练决策树
data = pd.DataFrame({
"浏览时长(分)": [10, 5, 20, 3, 25, 8, 15, 2],
"是否加购": [1, 0, 1, 0, 1, 1, 0, 0],
"是否购买": [1, 0, 1, 0, 1, 0, 1, 0]
})
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=(10, 6))
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(0, 0.5, 0.9, 0.8)
plt.xlim(0, 1)
plt.ylim(-1.5, 1.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=[0, 1])
树状图清晰展示了决策树的分支逻辑——以“浏览时长≤12.5分?”“是否加购≤0.5?”为条件,最终输出“购买”或“不购买”的预测结果,节点标注了样本数量,帮助业务人员快速理解用户购买的判断依据。
Pyplot树状图的核心优势是“适配层级数据的多样化场景”,在电商、金融、企业管理等领域均有广泛应用,典型场景如下:
将“大类→中类→小类”的商品结构与销量结合,用树状图展示:一级节点为“家电”“服饰”等大类,二级为“智能手机”“连衣裙”等中类,三级为具体商品;节点颜色深度对应销量高低,帮助运营快速识别高销量商品所在层级,优化库存分配。
基于客户“资产规模→信用评分→历史违约记录”构建层级树,节点标注风险等级(低/中/高),用红色标注高风险客户所在分支,为风控人员提供直观的客户风险画像,辅助贷款审批决策。
除决策树外,pyplot树状图还可用于展示聚类结果的层级关系(如层次聚类的树状图)、关联规则的推导路径,帮助数据分析师向非技术人员解释模型逻辑,降低沟通成本。
将“项目→阶段→任务→子任务”用树状图展示,节点标注完成率(如“80%”),用绿色表示已完成、黄色表示进行中、红色表示延期,让项目负责人清晰掌握任务推进情况。
原因:坐标计算未考虑节点数量,垂直/水平步长设置不合理;
解决方案:根据子节点数量动态调整步长(如“总高度/子节点数”),层级越深步长越小;用递归函数统一管理坐标计算,避免手动赋值误差。
原因:pyplot默认字体不支持中文;
解决方案:添加字体配置代码:plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans'],同时设置英文备用字体。
原因:层级过深导致横向/纵向空间不足,节点挤压;
解决方案:① 采用“折叠树”逻辑,默认展示前3级,点击展开深层节点(需结合交互库如mpl_toolkits);② 调整画布大小(如figsize=(15, 10)),缩小节点高度/宽度,增加层级间距。
原因:坐标计算与数据强耦合,未封装通用函数;
解决方案:将坐标计算、绘图逻辑封装为通用函数(如plot_tree(data, direction='horizontal')),数据更新时仅需传入新的层级数据,无需修改绘图代码。
Pyplot树状图并非“开箱即用”的工具,但其“基础函数组合+高度定制化”的特性,使其成为Python生态中处理层级数据可视化的核心选择。其核心优势可概括为:
灵活可控:从节点样式到分支线条,全流程可定制,适配各类业务规范;
生态融合:与Pandas、sklearn等工具无缝衔接,嵌入数据分析流程更高效;
成本极低:无需额外安装依赖,Python数据分析环境默认支持。
未来拓展方向:结合交互库(如mpl_toolkits.mplot3d实现3D树状图、ipywidgets实现节点点击展开),提升树状图的交互性;结合颜色映射(cmap)实现节点与业务指标的深度关联,让可视化不仅“好看”更“有用”。
对于数据可视化从业者而言,掌握pyplot树状图的核心是“理解层级数据的坐标映射逻辑”——只要能将数据层级转化为合理的坐标系统,就能通过基础函数组合出满足业务需求的树状图,成为数据分析结果呈现的有力工具。

数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
CDA数据分析师 出品 作者:李诗怡 四层结构 · 零件与房子 · 六大易错点 一、什么是指标体系 定义:指标体系是整套完整框架 ...
2026-10-13写在开头 先还原一个你大概率见过的场面。 立项会上有人说:我们得做用户画像。 于是团队关进会议室,白板写满便利贴,两小时后 ...
2026-10-13 很多数据分析师每天都在计算指标、制作报表,但当被问到“什么叫指标数据元”“指标数据标准包含哪些核心维度”“指标数据质 ...
2026-10-13在统计学与数据分析研究中,相关性分析分为数值变量分析与分类变量分析两大类。针对身高、销量、分数等连续数值变量,通常采用皮 ...
2026-10-12在Power BI可视化分析体系中,常规表格仅能展示枯燥的数值数据,存在数据对比不直观、强弱规律不突出、维度交叉分析低效等问题。 ...
2026-10-12 很多数据分析师能熟练写SQL、做透视表,但当被问到“数据是从哪里来的?经过哪些加工才进入数据仓库?ETL具体做了什么?”时 ...
2026-10-12在传统零售行业同质化竞争激烈、大众营销转化率持续走低的背景下,依托经验与直觉的粗放式营销逐渐失效。美国塔吉特百货(Target ...
2026-10-10随着智能客服、数字化服务、用户精细化运营的快速普及,传统零散、非标准化的客户服务数据与业务体系逐渐难以支撑高效服务治理。 ...
2026-10-10 很多数据分析师能熟练地写SQL、做透视表、算描述性统计,但当被问到“如何预测用户流失概率”“如何归因销量下滑的关键因素 ...
2026-10-10CDA数据分析师 出品 作者:李诗怡 定义区别 · 场景举例 · 指标分类 · 计算方法 知识体系总览 模块 包含内容 一、核 ...
2026-10-09在数据分析工作流中,业务数据大多存储在各类关系型数据库内,例如MySQL、PostgreSQL、SQLite等。Pandas是Python生态中主流的数 ...
2026-10-09在数字化精细化运营时代,海量用户存在需求差异、行为差异、价值差异与偏好差异。如果企业采用“一刀切”的统一营销、统一服务、 ...
2026-10-09 很多数据分析师拿到数据就开始清洗、建模,但当被问到“这批数据属于什么类型——结构化还是非结构化?分类变量还是数值变量 ...
2026-10-09指标体系是企业数字化分析、业务监控、经营决策的核心基础框架,是将零散数据转化为可衡量、可对比、可落地业务价值的关键体系。 ...
2026-10-08随着市场竞争日趋饱和,同质化低价竞争逐渐陷入内卷僵局,传统以价格、渠道、促销为核心的营销模式边际效益持续递减。在此背景下 ...
2026-10-08 很多数据分析师画过趋势图、做过业绩预测,但当被问到“这个月销售额增长20%,到底是长期趋势自然增长,还是促销活动的短期 ...
2026-10-08你有没有想过,手机里点外卖、刷社交软件、转一笔账,背后到底是谁在替你"记着账"? 答案其实很简单:数据库,以及跟它对话的那 ...
2026-10-07CDA数据分析师 出品 作者:李诗怡 一、数据分析四大思维 1. 对比思维:没有对比就没有分析 核心观点:单独一个数字没有意义,有 ...
2026-10-05Kimball 是方法,星型模型是它产出的形状。 很多人把"Kimball vs 星型模型"当成一道选择题——这本身就是个误会:Kimball 是动词 ...
2026-10-05写在开头 老板在微信上甩来一句: "帮我看下为什么销量跌了。" ” 你回工位,打开 SQL,开始写。查订单表、拉近三个月、按 ...
2026-10-03