如何在UpSet图中显示交集数值而非去重数值?
解决UpSet图显示包含性交集计数的问题
你看到的计数差异是因为UpSet图默认展示的是「精确子集」的元素数量——也就是只属于选中集合、不属于其他任何集合的元素个数。比如你提到的草食动物(herbivore)和哺乳动物(mammal)的交集显示为2,这2个元素是Rhinoceros和Moose(它们只属于这两个集合,不属于驯化动物集合);而另外3个交集元素Horse、Sheep、Cattle同时属于三个集合,被单独统计在「mammal+herbivore+domesticated」的子集中,两者相加才是你说的5个总交集元素。
如果你想让UpSet图展示包含性交集的计数(即所有属于选中集合的元素,不管是否属于其他集合),可以通过以下步骤修改代码:
解决方案代码
import pandas as pd from upsetplot import from_contents, UpSet # 原始集合数据 mammals = ['Cat', 'Dog', 'Horse', 'Sheep', 'Pig', 'Cattle', 'Rhinoceros', 'Moose'] herbivores = ['Horse', 'Sheep', 'Cattle', 'Moose', 'Rhinoceros'] domesticated = ['Dog', 'Chicken', 'Horse', 'Sheep', 'Pig', 'Cattle', 'Duck'] # 生成元素-集合成员关系数据 animals = from_contents({'mammal': mammals, 'herbivore': herbivores, 'domesticated': domesticated}) # 获取默认的精确子集计数 exact_subset_counts = animals.value_counts().sort_index() # 计算每个子集的包含性计数(累加所有超集的计数) inclusive_counts = {} for subset in exact_subset_counts.index: # 筛选所有包含当前子集的超集 supersets = [s for s in exact_subset_counts.index if subset <= s] # 累加超集的计数总和 inclusive_counts[subset] = exact_subset_counts[supersets].sum() # 转换为UpSet可识别的DataFrame格式 inclusive_df = pd.Series(inclusive_counts, name='count').reset_index() # 绘制包含性交集计数的UpSet图 ax_dict = UpSet(inclusive_df, subset_size='count', show_counts=True).plot()
代码说明
- 第一步用
from_contents生成原始的元素-集合成员关系数据,和你的原始代码逻辑一致。 - 通过
value_counts()获取默认的精确子集计数,即每个「仅属于特定集合组合」的元素数量。 - 遍历每个子集,计算所有包含它的超集的计数总和——这就是该集合组合的包含性交集大小。
- 将计算结果转换为DataFrame,传入UpSet绘图函数,即可得到展示包含性交集计数的图表。
补充说明
如果你只是误解了UpSet图的默认逻辑,其实它展示的精确子集信息也是集合分析中常用的维度(区分元素是否仅属于特定集合),这种情况下不需要修改代码,只需要理解每个条形代表的是「仅属于该集合组合」的元素数量即可。
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

