You need to enable JavaScript to run this app. 如何定制UpSetR/ComplexUpset实现固定集合顺序、指定交集与分组配色
优惠活动
大模型
产品
解决方案
定价
更多

如何定制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.12 11:24:01