比例数据可视化

【实验名称】绘制板块层级图

【实验目的】

1.掌握数据文件读取

2.掌握数据处理的方法

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

【实验原理】

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

【实验环境】

OS:win11
python:v3.13

【实验步骤】

一、安装所需库

1、输入命令:pip install pandas
在这里插入图片描述
2、输入命令:pip install matplotlib
在这里插入图片描述

3.输入命令:pip install seabor
在这里插入图片描述
4.输入命令:pip install squarify

在这里插入图片描述

二、读取数据

在这里我们使用pandas库中的read_csv函数来读取这3个数据文件。
在这里插入图片描述
在这里插入图片描述

三、数据处理

我们需要根据源表对目标表进行匹配查询,使用 merge 函数进行操作。
在这里插入图片描述
原代码版本老旧,不适应目前版本。

加入了判断条件,使得确保在合并前的必要列存在

# 确保在合并前的必要列存在
if 'aisle_id' not in aisles_df.columns:
    raise ValueError("aisles_df 中缺少 'aisle_id' 列。")
if 'department_id' not in departments_df.columns:
    raise ValueError("departments_df 中缺少 'department_id' 列。")

# 合并数据框
order_products_prior_df = pd.merge(products_df, aisles_df, on='aisle_id', how='left')
order_products_prior_df = pd.merge(order_products_prior_df, departments_df, on='department_id', how='left')

# 创建临时数据框
temp = order_products_prior_df[['product_name', 'aisle', 'department']]
temp = pd.concat([
    order_products_prior_df.groupby('department')['product_name'].nunique().rename('products_department'),
    order_products_prior_df.groupby('department')['aisle'].nunique().rename('aisle_department')
], axis=1).reset_index()

实现结果:
在这里插入图片描述
四、绘制板块层级图
在这里插入图片描述
上述参考代码使用了viridis色图进行渲染,由于我的版本于现在不兼容,故做出了一系列修改,即使用 plasma 色图来完成该操作:

# 设置颜色映射
cmap = matplotlib.cm.plasma  # 使用 'plasma' 色图
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[0] = "#4F5B93"  # 使用有效的颜色代码

# 创建标签
labels = [
    "%s\n%d aisle num\n%d products num" % (label, aisle_num, product_num)
    for label, aisle_num, product_num in zip(temp2.index, temp2.aisle_department, temp2.products_department)
]

# 创建图形
fig = plt.figure(figsize=(12, 10))
ax = fig.add_subplot(111, aspect="equal")

# 绘制矩形图
squarify.plot(
    temp2.aisle_department,
    color=colors,
    label=labels,
    ax=ax,
    alpha=0.7
)

运行结果:
在这里插入图片描述
设置 x、y 轴的属性

# 添加图表标题
fig.suptitle("How are aisles organized within departments", fontsize=20)

# 添加数据标签
img = plt.imshow([temp2.products_department], cmap=cmap)
img.set_visible(False)  # 隐藏对于imshow的原始图
fig.colorbar(img, orientation="vertical", shrink=0.96)  # 添加颜色条
fig.text(0.76, 0.9, 'numbers of products', fontsize=14)  # 添加说明文本

# 添加标题
plt.title("Aisle Department Visualization")
plt.show()

板块层级图效果如下:
在这里插入图片描述
完整代码实现:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
import squarify

# 加载数据框(请根据自己的文件路径修改)
departments_df = pd.read_csv("E:\\technology\\The_fourth_theaper\\departments.csv")
aisles_df = pd.read_csv("E:\\technology\\The_fourth_theaper\\aisles.csv")
products_df = pd.read_csv("E:\\technology\\The_fourth_theaper\\products.csv")

# 确保在合并前的必要列存在
if 'aisle_id' not in aisles_df.columns:
    raise ValueError("aisles_df 中缺少 'aisle_id' 列。")
if 'department_id' not in departments_df.columns:
    raise ValueError("departments_df 中缺少 'department_id' 列。")

# 合并数据框
order_products_prior_df = pd.merge(products_df, aisles_df, on='aisle_id', how='left')
order_products_prior_df = pd.merge(order_products_prior_df, departments_df, on='department_id', how='left')

# 创建临时数据框
temp = order_products_prior_df[['product_name', 'aisle', 'department']]
temp = pd.concat([
    order_products_prior_df.groupby('department')['product_name'].nunique().rename('products_department'),
    order_products_prior_df.groupby('department')['aisle'].nunique().rename('aisle_department')
], axis=1).reset_index()

# 设置索引为部门
temp = temp.set_index('department')

# 按 'aisle_department' 降序排序
temp2 = temp.sort_values(by='aisle_department', ascending=False)

# 设置颜色映射
cmap = matplotlib.cm.plasma  # 使用 'plasma' 色图
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[0] = "#4F5B93"  # 使用有效的颜色代码

# 创建标签
labels = [
    "%s\n%d aisle num\n%d products num" % (label, aisle_num, product_num)
    for label, aisle_num, product_num in zip(temp2.index, temp2.aisle_department, temp2.products_department)
]

# 创建图形
fig = plt.figure(figsize=(12, 10))
ax = fig.add_subplot(111, aspect="equal")

# 绘制矩形图
squarify.plot(
    temp2.aisle_department,
    color=colors,
    label=labels,
    ax=ax,
    alpha=0.7
)

# 添加图表标题
fig.suptitle("How are aisles organized within departments", fontsize=20)

# 添加数据标签
img = plt.imshow([temp2.products_department], cmap=cmap)
img.set_visible(False)  # 隐藏对于imshow的原始图
fig.colorbar(img, orientation="vertical", shrink=0.96)  # 添加颜色条
fig.text(0.76, 0.9, 'numbers of products', fontsize=14)  # 添加说明文本

# 添加标题
plt.title("Aisle Department Visualization")
plt.show()

【实验总结】

环境准备

我首先在Windows 11上安装了Python 3.13,并通过命令行安装了所需的库,包括pandas、matplotlib、seaborn和squarify。这一步比较顺利,没有遇到重复安装或者版本冲突的问题。

数据读取

使用pandas的read_csv函数,我读取了三个数据文件(departments、aisles和products)。在这一过程中,我掌握了如何通过正确的方式加载不同的数据集,为后续的数据处理打下了基础。

数据处理

我使用merge函数将产品数据与类别进行匹配。这一阶段遇到的一个问题是,初始代码因为使用了老旧的版本而导致某些列名找不到。因此,我加入了判断条件,确保在合并前必要的列确实存在。这一措施极大地减少了可能出现的错误,增强了代码的鲁棒性。

绘制板块层级图

在最后一步,我使用matplotlib和squarify绘制了一个层级图。由于我的版本与参考代码中使用的色图不兼容,我选择了修改为plasma色图。这一阶段让我学会了如何根据数据的特征自定义可视化效果。在图形中,我成功展示了不同类别和产品数量的关系。

遇到的问题与解决办法

数据合并错误:如前所述,初始代码的兼容性问题导致无法找到某些列。为此,我进行了代码更新,加入了列存在性的检查,以确保数据合并能够顺利进行。

可视化效果不佳:最开始的色图不适合我的数据版本,经过修改后使用了plasma色图,这改善了视觉效果并使得数据的呈现更加清晰。

收获与总结

通过这个实验,我不仅学习到如何处理和可视化数据,还掌握了调试程序和解决问题的方法。我意识到在数据分析的过程中,细节至关重要,尤其是数据结构的了解和确保数据完整性。同时,这次实验增强了我在数据处理中解决实际问题的能力,也让我更深入地理解了数据可视化的重要性和实用性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值