如何绘制特征存在/缺失组合的可视化图表?
实现方案
你需要的效果可以直接用seaborn的二元热图实现,只需要先调整行列顺序匹配你的预期布局即可,完整可运行代码如下:
步骤1:调整数据集行列顺序
先把特征列按出现频次从高到低排序,样本行按拥有特征的数量从少到多排序,和你给出的预期结构完全匹配:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 原始数据集 f_list = ['feature_5','feature_3','feature_1','feature_4','feature_2','feature_6'] v = [[0,0,0,1,1,1],[0,1,1,1,1,1],[0,0,0,0,1,1],[0,0,1,1,1,1],[0,0,0,0,0,1],[1,1,1,1,1,1]] df = pd.DataFrame(data=v, columns=f_list, index=range(6)) # 列按特征总出现频次降序排序 col_sort = df.sum().sort_values(ascending=False).index df_sorted_col = df[col_sort] # 行按样本拥有的特征总数升序排序 df_sorted = df_sorted_col.loc[df_sorted_col.sum(axis=1).sort_values().index]
步骤2:绘制特征存在/缺失热图
plt.figure(figsize=(10, 6)) ax = sns.heatmap(df_sorted, cmap=['#FFFFFF', '#4472C4'], # 0对应白色(缺失)、1对应蓝色(存在) cbar=False, # 隐藏右侧颜色条 linewidths=0.5, # 显示格子边框 linecolor='lightgray', xticklabels=df_sorted.columns, yticklabels=df_sorted.index, annot=True, # 开启格子标注 fmt='s', mask=df_sorted==0, # 缺失位置不显示标注 annot_kws={'fontsize':14}) # 将存在位置的默认标注"1"替换为你需要的"x" for text in ax.texts: if text.get_text() == '1': text.set_text('x') # 样式调整 ax.set_xlabel('特征') ax.set_ylabel('样本编号') plt.yticks(rotation=0) plt.show()
效果说明
- 蓝色带
x的方格表示特征存在,白色空格表示特征缺失 - 列顺序、行顺序和你给出的预期效果完全一致
- 不需要
x标记的话删掉annot相关的所有配置即可,只靠色块区分更清爽
内容的提问来源于stack exchange,提问作者raulEdcba
相关产品推荐
相关产品推荐

