UpSetR自定义指定交集的upset图计数显示错误的解决方法
问题描述
- 实验者持有A、B、C、D四组Ensembl基因ID构成的集合,最初使用
UpSetR包的默认upset函数绘制交集图,后因需要重点展示A&B、A&C、A&D三组两两交集,自定义了intersections参数指定要显示的交集条目。 - 实际绘图后发现图中展示的交集计数和手动计算结果不符:手动核算得A∩B元素数为4、A∩C为4、A∩D为3,但图中显示的对应数值远低于上述实际值。
计数失真的核心原因
很多使用UpSetR的用户都会踩这个统计逻辑的坑:
- 你预期的交集计数是“两个集合的全量共同元素总数”,但UpSetR默认的统计规则是,算某一组交集(比如A&B)的元素时,只会计入仅属于这几个指定集合、不属于其他所有集合的元素。
- 举个实际的例子:你手动算的A和B共有的4个基因里,有几个其实同时也在C或者D集合里存在。默认规则下,这部分跨组的基因不会被算进A&B的条目里,会被自动归到包含C/D的多集合交集分类中,最后你看到的A&B柱形高度自然就比实际值低。
调整方法
完全不用修改你已经整理好的原始集合数据,只要在原有代码里加一个关键参数,就能匹配你想要的统计逻辑:
- 新增参数
group.by = "all":这个参数会把统计规则改成,只要元素属于当前交集条目包含的所有集合,就会被计入该条目的计数,不会再把同时存在于其他未指定集合的元素排除出去。 - 可选加参数
empty.intersections = "omit":自动把计数为0的空交集条目藏起来,图面会更简洁。
可直接运行的调整后代码如下:
library(UpSetR) # 原有集合列表无需修改 mine <- list("A" = A, "B" = B, "C" = C, "D" = D) upset( fromList(mine), intersections = list( list("A"), list("B"), list("C"), list("D"), list("A", "B"), list("A", "C"), list("A", "D") ), group.by = "all", # 核心调整:统计全量共同元素,不排除跨组元素 empty.intersections = "omit", keep.order = TRUE )
调整完成后,图中A&B、A&C、A&D三个条目的计数会和手动计算的全量共同元素数完全一致,原有自定义的交集配置可以直接保留,不需要额外新增全集合共同交集的条目。
内容的提问来源于stack exchange,提问作者beginner
相关产品推荐
相关产品推荐

