绘制板块层级图

实验名称

绘制板块层级图

实验目的

1.掌握数据文件读取

2.掌握数据处理的方法

3.实现板块层级图的绘制

实验原理

   板块层级图(treemap)是一种基于面积的可视化方式,通过每一个板块(通常为矩形)的尺寸大小进行度量。外部矩形代表父类别,而内部矩形代表子类别。我们也可以通过板块层级图简单的呈现比例关系,不过它更擅于呈现树状结构的数据。读取绘图所用的数据,并对数据进行处理将数据处理成我们可以使用的形式,绘制板块层级图,设置标签和标题。

关键信息总结:

1. 板块层级图(Treemap)定义
- 基于面积的可视化方法,用矩形尺寸表示数据大小。
- 外部矩形 = 父类别,内部矩形 = 子类别。
- 擅长展示树状结构数据,也可呈现比例关系。

2. 绘图步骤
- 数据读取与处理:整理数据为适合绘图的格式(如分层结构)。
- 绘制图表:使用工具(如Python的`matplotlib`或`plotly`)生成Treemap。
- 设置标签与标题:标注父/子类别名称,添加图表标题。

3. 适用场景
- 展示层级关系(如文件目录、市场份额分类)。
- 直观比较不同类别的占比(通过矩形面积)。

实验环境

OS:Windows11

python:v3.12

实验步骤

一、安装pandas、matplotlib、seaborn、squarify#

1.输入命令:pip install pandas

2.输入命令:pip install matplotlib

3.输入命令:pip install seaborn

4.输入命令:pip install squarify

二、读取数据

在这里我们使用pandas库中的read_csv函数来读取这3个数据文件。

复制代码
 1 import pandas as pd
 2  
 3 # 读取CSV文件
 4 products_df = pd.read_csv('C:/Users/Administrator/Downloads/products.csv')
 5 aisles_df = pd.read_csv('C:/Users/Administrator/Downloads/aisles.csv')
 6 departments_df = pd.read_csv('C:/Users/Administrator/Downloads/departments.csv')
 7  
 8 # 打印每个DataFrame的前几行,以验证读取是否成功
 9 print("Products DataFrame:")
10 #print(products_df.to_string(index=False))
11 print(products_df.head())
12  
13 print("\nAisles DataFrame:")
14 #print(aisles_df.to_string(index=False))
15 print(aisles_df.head())
16  
17 print("\nDepartments DataFrame:")
18 print(departments_df.to_string(index=False))
复制代码

数据读取的结果:

三、数据处理

我们需要根据源表对目标表进行匹配查询,使用merge函数进行操作。

复制代码
 1 order_products_prior_df = pd.merge(products_df, aisles_df, on='aisle_id', how='left')
 2 order_products_prior_df = pd.merge(order_products_prior_df, departments_df, on='department_id', how='left')
 3 order_products_prior_df.head()
 4 temp = order_products_prior_df[['product_name', 'aisle', 'department']]
 5 temp = pd.concat([
 6     order_products_prior_df.groupby('department')['product_name'].nunique().rename('products_department'),
 7     order_products_prior_df.groupby('department')['aisle'].nunique().rename('aisle_department')
 8 ], axis=1).reset_index()
 9  
10 temp = temp.set_index('department')
11 temp2 = temp.sort_values(by="aisle_department", ascending=False)
复制代码

  这段代码通过Pandas对多个数据表(产品、通道、部门)进行关联和聚合,最终生成一个按部门分组的统计表(`temp2`),其中包含每个部门的唯一商品数量和唯一通道数量。代码首先使用`pd.merge`将产品、通道和部门表按`aisle_id`和`department_id`左连接,确保数据完整性;随后提取关键字段(`product_name`、`aisle`、`department`),并按部门分组统计唯一值数量,生成两列指标(`products_department`和`aisle_department`)。最后,将部门设为索引并按通道数降序排序,为后续绘制板块层级图(Treemap)提供结构化数据,其中部门作为父类别,商品和通道数量分别决定矩形面积和颜色映射,直观展示层级与比例关系。

将进行匹配操作后的数据进行输出:

四、绘制板块层级图

绘制初始的板块层级图

复制代码
cmap = matplotlib.cm.viridis
mini,maxi = temp2.products_department.min(),temp2.products_department.max()
norm = matplotlib.colors.Normalize(vmin=mini,vmax=maxi)
colors = [cmap(norm(value)) for value in temp2.products_department]
colors[1] = "#FBFCFE"
labels = ["%s\n%d aisle num\n%d products num"% (label) for label in
          zip(temp2.index,temp2.aisle_department,temp2.products_department)]
fig = plt.figure(figsize=(20,16))
ax = fig.add_subplot(111,aspect="equal")
ax = squarify.plot(temp2.aisle_department, color=colors, label=labels, ax=ax, alpha=.7)
复制代码

绘制结果如下:

 

设置x,y轴的属性:

1 ax.set_xticks([])
2 ax.set_yticks([])

添加图表标签:

1 fig.suptitle("How are aisles organized within departments",fontsize=20)

添加数据标签:

1 img = plt.imshow([temp.products_department],camp=camp)
2 img.set_visible(False)
3 fig.colorbar(img,orientation="vertical",shrink=.96)
4 fig.text(.76,.9,"numbers of products",fontsize=14)

板块层级图效果如下:

 

实验总结

      本次"绘制板块层级图"实验让我收获颇丰,不仅掌握了数据可视化的关键技术,更深刻理解了数据分析和呈现的重要性。通过实验,我系统性地完成了从数据读取、处理到可视化呈现的完整流程,实现了商品-通道-部门层级结构的直观展示。

      在实验过程中,我首先使用Pandas库成功读取并合并了三个数据表(products、aisles、departments),通过merge操作确保数据的完整性和一致性。数据处理阶段,我运用groupby和nunique方法进行分组统计,计算出每个部门的商品数量和通道数量,为后续可视化奠定了数据基础。

       实验中最具挑战性的是Treemap的绘制环节。我通过squarify库实现了基于面积的层级可视化,其中:
1)矩形大小代表商品数量
2)颜色深浅反映通道多样性
3)标签清晰展示部门名称及关键指标

       遇到的问题及解决方案:
1. 数据合并时出现空值:通过检查外键匹配情况,确保数据完整性
2. 颜色映射不均衡:使用matplotlib.colors.Normalize动态调整颜色范围
3. 标签重叠问题:优化标签内容和布局,提高可读性

       主要收获:
1. 掌握了Pandas数据处理的核心方法(merge、groupby等)
2. 熟练使用Matplotlib和Squarify进行高级可视化
3. 理解了层级数据可视化的设计原则
4. 培养了数据分析和问题解决能力

       改进方向:
1. 尝试交互式可视化工具(如Plotly)
2. 扩展更复杂的多级Treemap
3. 优化颜色方案和标签布局
4. 增加动态数据更新功能

 

posted @ 2025-04-21 08:34  小菲困困  阅读(56)  评论(0)    收藏  举报