使用 squarify 或 Plotly,通过矩形面积展示层次结构数据的占比。

在数据可视化的领域,如何清晰地展示“部分”与“整体”的关系,特别是处理具有层级结构的数据时,一直是一项挑战。传统的饼图在类别过多时会变得难以辨认,而柱状图则难以展现层级关系。在这种情况下,树状图 (Treemap) 以其独特的优势脱颖而出。
树状图通过递归地将矩形区域划分为更小的矩形,直观地展示了层次结构数据。每个小矩形的面积与其所代表的数值成正比,嵌套关系清晰地揭示了数据的层级归属。无论是分析公司各部门的预算占比,还是研究网站不同流量来源的贡献,树状图都能让这些信息一目了然。
本篇深度技术教程将带你探索在 Python 中创建树状图的两种主要方法:
我们将通过七个精心设计的案例,从基础到复杂,帮助你彻底掌握这两种工具。
squarifyplotlySquarify 库基于 “Squarified Treemaps” 算法,致力于生成长宽比尽可能接近 1 的矩形,从而使图表更加美观和易读。它非常适合快速生成用于报告或演示的静态图片。
pip install squarify matplotlib
让我们从一组简单的数字开始,感受 Squarify 的简洁之美。
import matplotlib.pyplot as plt
import squarify
# 假设这是一组市场份额数据
sizes = [40, 30, 15, 10, 5]
plt.figure(figsize=(8, 6))
squarify.plot(sizes=sizes)
plt.title('市场份额基础树状图')
plt.axis('off') # 关闭坐标轴
plt.show()
squarify为了让图表更具信息量,我们可以为每个矩形添加标签和自定义颜色。
import matplotlib.pyplot as plt
import squarify
sizes = [40, 30, 15, 10, 5]
labels = ['A公司\n(40%)', 'B公司\n(30%)', 'C公司\n(15%)', 'D公司\n(10%)', '其他\n(5%)']
colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99','#c2c2f0']
plt.figure(figsize=(10, 7))
squarify.plot(sizes=sizes, label=labels, color=colors, alpha=0.8)
plt.title('各公司市场份额占比', fontsize=16)
plt.axis('off')
plt.show()
通过 label 和 color 参数,图表的可读性得到了显著提升。
labelcolor在实际应用中,数据通常存储在 Pandas DataFrame 中。下面我们模拟分析一个网站不同来源的流量数据。
import pandas as pd
import matplotlib.pyplot as plt
import squarify
# 模拟数据
data = {
'Source': ['直接访问', '搜索引擎', '社交媒体', '外部链接', '邮件营销'],
'Visits': [2500, 4500, 1500, 800, 300]
}
df = pd.DataFrame(data).sort_values(by='Visits', ascending=False)
# 准备绘图数据
sizes = df['Visits']
labels = [f"{source}\n({visits}次)" for source, visits in zip(df['Source'], df['Visits'])]
plt.figure(figsize=(12, 8))
squarify.plot(sizes=sizes, label=labels, color=plt.cm.viridis_r(sizes/float(max(sizes))), pad=True)
plt.title('网站流量来源分析', fontsize=18)
plt.axis('off')
plt.show()
在这个案例中,我们使用了 plt.cm.viridis_r 根据数值大小动态生成颜色,并用 pad=True 在矩形间添加了细微的边距。
matplotlib.cmpad=True当我们需要展示更复杂的层级关系,并希望用户能够交互式地探索数据时,Plotly 是一个很好的选择。
plotly对于那些寻求高效且功能强大的数据可视化工具来说,Plotly无疑是最佳选择。
pip install plotly pandas
通过使用Plotly模块,创建交互式图表变得异常简便。
import plotly.express as px
import pandas as pd
# 创建简化版的全球GDP数据
df = pd.DataFrame({
"Continent": ["亚洲", "亚洲", "欧洲", "欧洲", "北美洲", "北美洲"],
"Country": ["中国", "日本", "德国", "英国", "美国", "加拿大"],
"GDP": [19.9, 4.9, 4.4, 3.3, 26.8, 2.2]
})
fig = px.treemap(df, path=[px.Constant("全球"), 'Continent', 'Country'], values='GDP', title='全球主要经济体GDP分布 (交互式)')
fig.show()
执行上述代码后,将生成一个可交互的树状图。用户可以通过点击“亚洲”来查看中国和日本的具体视图,同时,顶部的路径栏便于用户返回上一级视图。
plotly.express除了基本的GDP数据,我们还可以加入国家的人口数据,利用颜色和悬停信息来丰富图表的表达力。
import plotly.express as px
import pandas as pd
df = pd.DataFrame({
"Continent": ["亚洲", "亚洲", "欧洲", "欧洲", "北美洲", "北美洲"],
"Country": ["中国", "日本", "德国", "英国", "美国", "加拿大"],
"GDP": [19.9, 4.9, 4.4, 3.3, 26.8, 2.2],
"Population": [14.1, 1.2, 0.83, 0.67, 3.3, 0.38] # 以亿为单位
})
fig = px.treemap(df, path=[px.Constant("全球"), 'Continent', 'Country'], values='GDP', color='Population', hover_data=['GDP', 'Population'], color_continuous_scale='YlGnBu', title='GDP与人口的多维度分析')
fig.update_traces(textinfo="label+value", selector=dict(type='treemap'))
fig.show()
在此版本中,矩形的面积表示GDP,颜色的深浅则反映了人口的数量。当鼠标悬停时,还会显示具体的GDP和人口数据,极大地提高了信息的密集度。
本案例展示了如何编写一个脚本来获取目录结构的大小,并使用Plotly进行可视化。
plotlyimport os
import plotly.express as px
import pandas as pd
def get_path_sizes(path='.'):
"""递归地获取路径下所有文件和目录的大小"""
dir_paths, dir_names, dir_sizes = [], [], []
for dirpath, _, filenames in os.walk(path):
total_size = sum(os.path.getsize(os.path.join(dirpath, f)) for f in filenames if not os.path.islink(os.path.join(dirpath, f)))
if total_size > 0:
dir_paths.append(dirpath)
dir_names.append(os.path.basename(dirpath))
dir_sizes.append(total_size)
df = pd.DataFrame({
'path': dir_paths,
'name': dir_names,
'size': dir_sizes
})
return df
# 运行此脚本时,请确保在项目目录下或指定要分析的目录
# path_to_scan = '/path/to/your/project'
path_to_scan = '.'
df_disk = get_path_sizes(path_to_scan)
# 为了构建层次结构,需要处理路径字符串
df_disk['parent'] = df_disk['path'].apply(lambda x: os.path.dirname(x))
通过上述脚本,可以有效地分析文件系统的磁盘占用情况,帮助用户更好地理解和管理他们的存储资源。
df_disk['id'] = df_disk['path']
# Plotly treemap可以直接使用id和parent来构建层级
fig = px.treemap(df_disk,
ids='id',
parents='parent',
values='size',
hover_name='name',
title=f'磁盘空间占用分析: {os.path.abspath(path_to_scan)}')
fig.update_traces(root_color="lightgrey")
fig.show()
这个交互式图表能够帮助你清楚地了解哪些子目录占据了最大的空间,并支持逐层深入查看详细信息,是进行磁盘管理的理想工具。
案例七:展示多层次销售网络
接下来,我们将探讨一个更为复杂的商业实例,即一个企业在全国不同区域、省份和城市之间的三级销售网络。
import plotly.express as px
import pandas as pd
# 创建模拟的销售数据
data = {
'Region': ['华东', '华东', '华东', '华北', '华北', '华南'],
'Province': ['上海', '江苏', '浙江', '北京', '天津', '广东'],
'City': ['上海市', '南京市', '杭州市', '北京市', '天津市', '深圳市'],
'Sales': [500, 300, 400, 600, 200, 700]
}
df_sales = pd.DataFrame(data)
fig = px.treemap(df_sales,
path=['Region', 'Province', 'City'], # 三层结构
values='Sales',
color='Sales',
color_continuous_scale='viridis',
title='公司全国销售网络分布')
fig.show()
第三部分:
squarifyplotly
- 如何做出选择?
特性
squarifyplotly
核心优势
- 简单、轻量,快速生成静态图形
- 高度互动,功能多样,支持多层次展示
依赖
matplotlib交互能力
- 无
- 支持悬停、点击深入、路径导航等交互方式
适用场景
- 快速生成报告或学术论文中的图表
- 用于数据探索性分析及Web应用集成
总结:
如果你需要迅速制作一张适用于演示或打印报告的美观静态树状图,
squarifyplotlyAI赋能:让可视化更智能
掌握这些工具后,你或许会思考,是否可以让这一过程更加自动化与智能化?答案是肯定的!
例如,0v0 AI助手可以作为你的编程伙伴。当面对一个全新的数据集,不确定最佳展示方式时,你可以询问:“我有一个包含A、B、C列的数据集,请建议一个合适的可视化方法,并生成
plotly在构建大规模数据仪表板或商业智能(BI)系统时,拥有稳定且强大的后端API是关键。
LLM AI API
和
FackAI.Chat
提供了高性价比的AI模型接口。借助这些API,你可以开发出“自然语言转图表”系统:用户只需输入“显示各地区销售额的树状图”,系统就能自动调用
plotly结论
树状图作为高效层次数据可视化的工具,在商业分析、系统监控、社会科学研究等多个领域都有广泛应用。通过本篇文章的学习,你已经学会了使用Python中的
squarifyplotly
扫码加好友,拉您进群



收藏
