如何用Python的Seaborn绘制三类分级且按数量降序的热力图?
使用Seaborn实现目标热力图
完全可以用Seaborn实现这类需求,下面是具体步骤和代码示例:
1. 数据预处理
先统计每个类别的数量,再将所有数据点按类别数量降序重新排列(数量最多的类别数据点排在最左侧)。
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 模拟数据集(替换成你实际的数据) data = ["类别1"]*10 + ["类别2"]*8 + ["类别3"]*6 df = pd.DataFrame({"类别": data}) # 统计类别数量 counts = df["类别"].value_counts() # 按类别数量降序排列数据点 sorted_data = df["类别"].sort_values(key=lambda x: x.map(counts), ascending=False).values # 转换为1行24列的矩阵,适配热力图输入格式 heatmap_data = sorted_data.reshape(1, -1)
2. 自定义颜色映射
为每个类别分配不同深浅的颜色,数量越多颜色越深:
# 生成同一色系的深浅色,数量多的类别对应深色 palette = sns.color_palette("Blues", n_colors=len(counts)) category_color_map = dict(zip(counts.index, palette[::-1])) # 反转调色盘,让多数量对应深色
3. 绘制热力图
用Seaborn的heatmap函数结合自定义规则实现需求:
plt.figure(figsize=(12, 2)) # 将类别转换为数值,用于映射颜色 category_num_map = dict(zip(counts.index, range(len(counts), 0, -1))) num_data = [[category_num_map[cat] for cat in row] for row in heatmap_data] sns.heatmap(num_data, cmap=sns.color_palette("Blues", n_colors=len(counts)), cbar=True, xticklabels=False, yticklabels=False, annot=False) plt.title("类别热力图(按数量降序排列)") plt.show()
关键说明
- 数据排序:通过
sort_values结合类别数量映射,保证数量多的类别数据点排在左侧 - 颜色控制:利用Seaborn调色盘自动生成同色系深浅色,也可手动指定每个类别的颜色值
- 热力图适配:设置合适的画布尺寸,隐藏冗余刻度,让每个数据点的颜色清晰展示
内容的提问来源于stack exchange,提问作者Avatarvatar
相关产品推荐
相关产品推荐

