如何定制UpSetR/ComplexUpset实现固定集合顺序、指定交集与分组配色
定制化UpSet图实现方案
你遇到的左侧行序错乱、自定义交集不生效的问题,本质是UpSetR/ComplexUpset的默认自动排序逻辑覆盖了用户传入的顺序参数,以下是可直接落地的两种实现路径,完全匹配你的需求:
路径1:基于现有UpSetR代码的修正方案
现有代码已经完成了交集列表定义、分色规则的大部分工作,只需要补充3个核心参数即可解决所有问题:
- 加
keep.order = TRUE:强制关闭UpSetR默认的“按集合大小自动重排左侧行”逻辑,严格按照sets = c("S1","S2","S3","S4", "S5","S6")的固定顺序渲染行,不会再出现S1/S2位置跳变的问题 - 加
order.by = "sets":让列方向的交集严格按照你在intersections列表里写的顺序从左到右排列,不会自动按交集大小重排 - 加
empty.intersections = "on":关闭UpSetR默认的“自动剔除空交集”逻辑,让你指定的S1-S2空交集可以正常在横轴占列显示,不会被删掉
修正后的完整代码如下(原有逻辑全部保留,仅补充缺失参数):
upset(df, sets = c("S1","S2","S3","S4", "S5","S6"), # 核心修正参数 keep.order = TRUE, order.by = "sets", empty.intersections = "on", # 原有配置保留 matrix.color="black", point.size=1, line.size = 0.3, text.scale=c(1, 0.5, 0.5, 0.4, 0.75, 0.6), mainbar.y.max=21, mb.ratio = c(0.7, 0.3), intersections = list( list("S1"), list("S1", "S3"), list("S1", "S4"), list("S1", "S6"), list("S1", "S3", "S4"), list("S1", "S3", "S6"), list("S1", "S4", "S6"), list("S1", "S3", "S4", "S5"), list("S1", "S3", "S4", "S6"), list("S1", "S3", "S4", "S5", "S6"), list("S1", "S2"), list("S2"), list("S2", "S3"), list("S2", "S3", "S4"), list("S2", "S3", "S4", "S6"), list("S2", "S3", "S4", "S5", "S6")), queries = list( list(query = intersects, params = list("S1"), color = "maroon", active = T), list(query = intersects, params = list("S1", "S3"), color = "maroon", active = T), list(query = intersects, params = list("S1", "S4"), color = "maroon", active = T), list(query = intersects, params = list("S1", "S6"), color = "maroon", active = T), list(query = intersects, params = list("S1", "S3", "S4"), color = "maroon", active = T), list(query = intersects, params = list("S1", "S3", "S6"),color = "maroon", active = T), list(query = intersects, params = list("S1", "S4", "S6"), color = "maroon", active = T), list(query = intersects, params = list("S1", "S3", "S4", "S5"), color = "maroon", active = T), list(query = intersects, params = list("S1", "S3", "S4", "S6"), color = "maroon", active = T), list(query = intersects, params = list("S1", "S3", "S4", "S5", "S6"), color = "maroon", active = T), list(query = intersects, params = list("S1", "S2"), color = "black", active = T), list(query = intersects, params = list("S2"), color = "blue", active = T), list(query = intersects, params = list("S2", "S3"), color = "blue", active = T), list(query = intersects, params = list("S2", "S3", "S4"), color = "blue", active = T), list(query = intersects, params = list("S2", "S3", "S4", "S6"), color = "blue", active = T), list(query = intersects, params = list("S2", "S3", "S4", "S5", "S6"), color = "blue", active = T) ))
路径2:稳定性更高的ComplexUpset实现方案
如果UpSetR的参数设置还是出现错乱,可以换用ComplexUpset实现,这个包对自定义顺序、空交集的支持更稳定,不会出现默认逻辑覆盖用户设置的问题,核心配置点如下:
- 固定左侧行顺序:传入集合顺序
c("S1","S2","S3","S4", "S5","S6")后,设置sort_sets = FALSE,严格按传入顺序渲染行,没有自动排序逻辑 - 固定列交集范围和顺序:把需要展示的交集整理成列表传入
intersections参数,设置sort_intersections = FALSE,严格按列表顺序排列列;设置min_size = 0保留空交集,不会自动剔除计数为0的列 - 批量配置分组建模:提前定义每个交集对应的填充色,一次完成映射,不需要逐列写query,避免顺序变动导致颜色错配
可直接复用的ComplexUpset代码:
library(ComplexUpset) library(ggplot2) # 严格按需求定义交集顺序 selected_intersections <- c( "S1", "S1&S3", "S1&S4", "S1&S6", "S1&S3&S4", "S1&S3&S6", "S1&S4&S6", "S1&S3&S4&S5", "S1&S3&S4&S6", "S1&S3&S4&S5&S6", "S1&S2", # 指定保留的S1-S2交集 "S2", "S2&S3", "S2&S3&S4", "S2&S3&S4&S6", "S2&S3&S4&S5&S6" ) # 批量定义分组建模规则 color_mapping <- c( "S1" = "maroon", "S1&S3" = "maroon", "S1&S4" = "maroon", "S1&S6" = "maroon", "S1&S3&S4" = "maroon", "S1&S3&S6" = "maroon", "S1&S4&S6" = "maroon", "S1&S3&S4&S5" = "maroon", "S1&S3&S4&S6" = "maroon", "S1&S3&S4&S5&S6" = "maroon", "S1&S2" = "black", "S2" = "blue", "S2&S3" = "blue", "S2&S3&S4" = "blue", "S2&S3&S4&S6" = "blue", "S2&S3&S4&S5&S6" = "blue" ) upset( df, intersect = c("S1","S2","S3","S4", "S5","S6"), sort_sets = FALSE, # 关闭集合自动排序,固定左侧行顺序 intersections = selected_intersections, sort_intersections = FALSE, # 关闭交集自动排序,固定列顺序 min_size = 0, # 保留空交集 width_ratio = 0.3, # 调整主图与矩阵区的比例 base_annotations = list( 'Intersection size' = intersection_size( mapping = aes(fill = group), counts = TRUE ) + scale_fill_manual(values = color_mapping) ), matrix = intersection_matrix( color = "black", size = 1, line_size = 0.3 ) )
注意事项
- 两种方案都不需要手动修改原始数据,只需要通过参数控制顺序和空交集展示即可
- 分色规则设置完成后,只要固定了映射关系,就不会出现颜色和交集错配的问题
- 不要开启和排序相关的默认参数,否则会覆盖手动设置的固定顺序
内容的提问来源于stack exchange,提问作者Anna Cot
相关产品推荐
相关产品推荐

