用Python制作华夫图:从零开始

发布于:2025-07-08 ⋅ 阅读:(13) ⋅ 点赞:(0)

在数据分析和可视化中,华夫图(Waffle Chart)是一种非常直观的图表,它可以清晰地展示不同类别之间的比例关系。今天,我们将通过一个简单的例子,一步步教你如何用Python制作华夫图。即使你没有任何编程基础,也可以轻松上手!

一、什么是华夫图?

华夫图是一种类似于饼图的可视化工具,但它以网格的形式展示数据。每个小格子代表一个单位,不同颜色的格子表示不同的类别。它非常适合用来展示分类数据的比例关系,比如不同产品的市场份额、不同地区的销售占比等。

二、准备数据

在开始之前,我们需要准备一些数据。在这个例子中,我们假设有一个医学研究项目,记录了7名患者的临床特征数据。这些特征包括“Grade Group”(分级组)、“PSA”(前列腺特异性抗原水平)、“ICC”(是否存在某种病变)、“IDC”(肿瘤浸润深度)和“Stage”(疾病阶段)。这些数据已经整理成一个表格,如下所示:

相关数据准备
患者编号 Grade Group PSA ICC IDC Stage
ICC1 Grade Group 2 PSA<10 ng/mL Present <pT3a <pT3b
ICC2 Grade Group 3 PSA>10 ng/mL Absent <pT3a <pT3a
ICC3 Grade Group 5 PSA<10 ng/mL Present <pT3b <pT3b
ICC4 Grade Group 2 PSA>10 ng/mL Absent <pT3b <pT3a
ICC5 Grade Group 3 PSA<10 ng/mL Present <pT3a <pT3b
ICC6 Grade Group 5 PSA>10 ng/mL Absent <pT3b <pT3a
ICC7 Grade Group 2 PSA<10 ng/mL Present <pT3b <pT3b

三、安装必要的库

在Python中,我们可以使用matplotlibpandas库来绘制华夫图。如果你还没有安装这些库,可以通过以下命令安装:

pip install matplotlib pandas

四、编写代码

1. 导入库

首先,我们需要导入必要的库。这些库将帮助我们处理数据和绘制图表。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

2. 创建数据

接下来,我们将数据整理成Python可以理解的格式。我们使用pandas库创建一个DataFrame,它是一个表格结构,方便我们操作数据。

# 创建患者和临床特征
patients = ['ICC1', 'ICC2', 'ICC3', 'ICC4', 'ICC5', 'ICC6', 'ICC7']
clinical_features = ['Grade Group', 'PSA', 'ICC', 'IDC', 'Stage']
# 创建数据
data = {
    'Grade Group': ['Grade Group 2', 'Grade Group 3', 'Grade Group 5', 'Grade Group 2', 'Grade Group 3', 'Grade Group 5', 'Grade Group 2'],
    'PSA': ['PSA<10 ng/mL', 'PSA>10 ng/mL', 'PSA<10 ng/mL', 'PSA>10 ng/mL', 'PSA<10 ng/mL', 'PSA>10 ng/mL', 'PSA<10 ng/mL'],
    'ICC': ['Present', 'Absent', 'Present', 'Absent', 'Present', 'Absent', 'Present'],
    'IDC': ['<pT3a', '<pT3a', '<pT3b', '<pT3b', '<pT3a', '<pT3b', '<pT3b'],
    'Stage': ['<pT3b', '<pT3a', '<pT3b', '<pT3a', '<pT3b', '<pT3a', '<pT3b']
}
# 转换数据为DataFrame
df = pd.DataFrame(data, index=patients)

3. 创建颜色映射

为了在华夫图中区分不同的类别,我们需要为每个类别分配一个颜色。我们使用一个字典来存储颜色映射。

colors = {
    'Grade Group 2': 'royalblue',
    'Grade Group 3': 'orange',
    'Grade Group 5': 'lightblue',
    'PSA<10 ng/mL': 'lightgreen',
    'PSA>10 ng/mL': 'yellow',
    'Present': 'violet',
    'Absent': 'pink',
    '<pT3a': 'lightyellow',
    '<pT3b': 'lightcyan'
}

4. 将数据转换为数值类型

matplotlib绘图时需要数值类型的输入,因此我们需要将数据中的类别转换为数值。我们使用pandasmap函数来实现这一点。

# 为每个类别分配一个唯一的数值
value_map = {value: i for i, value in enumerate(colors.keys())}
# 将数据转换为数值类型
df_numeric = df.apply(lambda x: x.map(value_map).fillna(-1).astype(int))

5. 绘制华夫图

现在,我们已经准备好绘制华夫图了。我们将使用matplotlibimshow函数来绘制图表,并添加标签和颜色条。

# 创建图表
plt.figure(figsize=(10, 8))
# 创建热图
plt.imshow(df_numeric, cmap='tab20', aspect='auto')
# 设置标签
plt.yticks(np.arange(len(patients)) + 0.5, patients, rotation=0)
plt.xticks(np.arange(len(clinical_features)) + 0.5, clinical_features, rotation=45)
plt.xlabel('Clinical Features')
plt.ylabel('Patients')
# 显示颜色条
cbar = plt.colorbar(ticks=range(len(value_map)))
cbar.set_ticklabels(list(value_map.keys()))
plt.tight_layout()
plt.show()

五、运行代码并查看结果

当你运行上述代码时,你会看到一个华夫图。每个小格子代表一个患者的某个临床特征,颜色表示不同的类别。通过这个图表,我们可以直观地看到每个患者在不同特征上的分类情况,如下图所示。

完整代码如下: 

六、总结

通过这个简单的例子,你已经学会了如何用Python制作华夫图。虽然代码看起来有点复杂,但只要按照步骤一步步来,你就能轻松掌握。希望这篇博客能帮助你更好地理解和使用Python进行数据可视化!


网站公告

今日签到

点亮在社区的每一天
去签到