You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:03:38