如何在独热编码的Pandas DataFrame中可视化重叠类别?
可视化类别重叠度的几种方案
根据你的DataFrame结构(每行是实例,列是类别,1表示属于该类别),以下是几种适合的可视化方法,覆盖从少类别到多类别的场景:
1. 2-3个类别:维恩图
维恩图适合展示少量类别间的重叠关系,先通过计数筛选出重叠度最高的前2或3个类别,再用matplotlib-venn绘制:
步骤:
- 先安装依赖库:
pip install matplotlib-venn
- 示例代码(假设你的DataFrame名为
df):
import matplotlib.pyplot as plt from matplotlib_venn import venn2 import pandas as pd # 统计每个类别的总实例数,排序后选前2个重叠最高的 category_counts = df.sum().sort_values(ascending=False) top_cats = category_counts.index[:2].tolist() # 计算仅属于A、仅属于B、同时属于A和B的实例数 only_a = df[(df[top_cats[0]] == 1) & (df[top_cats[1]] == 0)].shape[0] only_b = df[(df[top_cats[0]] == 0) & (df[top_cats[1]] == 1)].shape[0] both = df[(df[top_cats[0]] == 1) & (df[top_cats[1]] == 1)].shape[0] # 绘制维恩图 venn2(subsets=(only_a, only_b, both), set_labels=top_cats) plt.title(f"{top_cats[0]}与{top_cats[1]}的重叠情况") plt.show()
如果是3个类别,替换为venn3,计算7个区域的实例数即可,逻辑和上述代码一致。
2. 多类别:两两重叠热图
如果类别数量超过3个,维恩图会过于拥挤,用热图展示两两类别间的交集计数更直观:
示例代码:
import seaborn as sns import numpy as np import matplotlib.pyplot as plt categories = df.columns n = len(categories) # 初始化重叠计数矩阵 overlap_matrix = np.zeros((n, n)) # 填充矩阵:计算每对类别的共同实例数 for i in range(n): for j in range(n): overlap_matrix[i][j] = df[(df[categories[i]] == 1) & (df[categories[j]] == 1)].shape[0] # 绘制热图 plt.figure(figsize=(10, 8)) sns.heatmap(overlap_matrix, annot=True, fmt='g', xticklabels=categories, yticklabels=categories, cmap='Blues') plt.title("类别两两重叠计数") plt.show()
热图中,对角线是每个类别的总实例数,其他位置的数值越高,说明对应两个类别的重叠度越高。
3. 多类别:UpSet图(推荐)
UpSet图专门用于展示多个集合的交集分布,比维恩图更清晰,适合类别较多的场景:
步骤:
- 安装依赖库:
pip install upsetplot
- 示例代码:
from upsetplot import plot import pandas as pd # 统计所有类别组合的出现次数 cat_combinations = df.apply(lambda row: tuple(categories[row == 1]), axis=1).value_counts() # 绘制UpSet图 plot(cat_combinations) plt.title("多类别重叠分布") plt.show()
这个图会清晰展示哪些类别组合的重叠实例数量最多,直接对应你要找的高重叠度类别。
内容的提问来源于stack exchange,提问作者ignacioct
相关产品推荐
相关产品推荐

