使用seaborn/matplotlib绘制按行类别着色的分类值热图
实现方案
选用图表类型
直接用seaborn.heatmap即可实现需求,核心逻辑是将原始0/1观测值和行分类属性做绑定映射,再通过自定义色盘实现分类颜色区分。
实现步骤
1. 导入依赖库
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
2. 构造示例数据(使用自己的真实数据可跳过这步)
df = pd.DataFrame({ 'ID': [1,2,3,4], 'Cat': ['A','B','A','C'], 'V1': [1,1,1,0], 'V2': [1,1,1,0], 'V3': [1,1,0,0] })
3. 生成绘图用的转换矩阵
将不同Cat分类的1值映射为不同的数值,0值保持不变,方便后续绑定颜色:
# 分类到数值的映射关系,可根据自己的分类调整 cat_map = {'A': 1, 'B': 2, 'C': 3} # 每行V列的0/1值 乘以 对应行的分类映射值,0乘任何数还是0,1会变成对应分类的数值 plot_matrix = df[['V1', 'V2', 'V3']].mul(df['Cat'].map(cat_map), axis=0)
4. 自定义颜色映射并绘图
# 自定义色盘:索引0对应未观测的0值(浅灰色),索引1对应A类红色,索引2对应B类绿色,索引3对应C类蓝色 custom_cmap = ['#f0f0f0', '#ff4444', '#00C851', '#33b5e5'] plt.figure(figsize=(6, 4)) # 绘制热图,关闭色条、单元格数值显示,加白色边框分割单元格 sns.heatmap( plot_matrix, cmap=custom_cmap, cbar=False, annot=False, linewidths=1, linecolor='white' ) # 自定义y轴标签,显示每行的ID和Cat信息,可根据需求调整 plt.yticks(ticks=[i+0.5 for i in range(len(df))], labels=[f'ID:{row.ID} Cat:{row.Cat}' for _, row in df.iterrows()], rotation=0) plt.xlabel('观测指标') plt.ylabel('样本') plt.title('指标观测情况') plt.show()
效果说明
- 值为0的单元格显示浅灰色,代表未观测
- 值为1的单元格会根据所在行的Cat分类显示对应颜色,完全符合需求
- 如果需要调整颜色,直接修改
custom_cmap里的色值即可
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

