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

ComplexUpset包中Upset图条纹颜色与指定组映射错误问题

问题描述

使用R语言ComplexUpset包绘制Upset图时,尝试通过额外的dataframe属性为集合条纹着色,出现两组颜色映射错误:

  • 预期规则:以C结尾的集合为浅三文鱼色(lightsalmon),以M结尾的为浅天蓝色(lightskyblue2),以S结尾的为浅绿(palegreen3)
  • 实际错误:"TvC"显示为蓝色(应为三文鱼色),"SvM"显示为三文鱼色(应为蓝色)

原代码如下:

library(ComplexUpset)

combined2 <- data.frame(letter = c("a", "b", "c", "d", "e"),
                        SvC = c(1,0,1,0,0),
                        TvC = c(1,1,1,1,0),
                        MvC = c(1,0,0,0,0),
                        SvM = c(0,0,1,0,0),
                        TvM = c(0,1,1,0,0),
                        TvS = c(1,0,1,0,1)
                        )

combined_metadata <- data.frame(set = c("SvC", "TvC", "MvC", "SvM", "TvM", "TvS"), #set name
                                relative_to = c("C", "C", "C", "M", "M", "S")) #set attribute

upset(combined2,
      intersect = treats,
      mode = 'inclusive_intersection',
      intersections = list(
        "SvC",
        "TvC",
        "MvC",
        "SvM",
        "TvM",
        "TvS",
        c("SvC", "TvC"),
        c("SvC", "TvC", "MvC"),
        c("SvM", "TvM")),
      stripes = upset_stripes(data = combined_metadata, 
                              aes(color = combined_metadata$relative_to),
                              colors = c("C" = "lightsalmon",
                                         "M" = "lightskyblue2",
                                         "S" = "palegreen3")
                              )
      )
问题原因
  1. intersect = treats中treats是未定义变量,会导致代码运行报错
  2. 直接使用combined_metadata$relative_to作为aes的颜色映射,会让颜色按metadata的行顺序分配,而非根据集合名称匹配Upset图中的实际集合顺序,导致映射错位
修正后的代码
library(ComplexUpset)

combined2 <- data.frame(letter = c("a", "b", "c", "d", "e"),
                        SvC = c(1,0,1,0,0),
                        TvC = c(1,1,1,1,0),
                        MvC = c(1,0,0,0,0),
                        SvM = c(0,0,1,0,0),
                        TvM = c(0,1,1,0,0),
                        TvS = c(1,0,1,0,1)
                        )

combined_metadata <- data.frame(set = c("SvC", "TvC", "MvC", "SvM", "TvM", "TvS"),
                                relative_to = c("C", "C", "C", "M", "M", "S"))

# 定义所有参与分析的集合列
treats <- colnames(combined2)[-1]

upset(combined2,
      intersect = treats,
      mode = 'inclusive_intersection',
      intersections = list(
        "SvC",
        "TvC",
        "MvC",
        "SvM",
        "TvM",
        "TvS",
        c("SvC", "TvC"),
        c("SvC", "TvC", "MvC"),
        c("SvM", "TvM")),
      stripes = upset_stripes(
        data = combined_metadata, 
        aes(color = relative_to), # 直接使用列名,让函数自动按集合名称匹配属性
        colors = c("C" = "lightsalmon",
                   "M" = "lightskyblue2",
                   "S" = "palegreen3")
      )
)
关键改动说明
  • 补全treats变量定义,明确参与分析的集合列,解决未定义变量报错问题
  • 将aes(color = combined_metadata$relative_to)改为aes(color = relative_to):upset_stripes会自动通过combined_metadata中的set列与Upset图中的集合名称关联,确保颜色映射与预期规则一致
  • 保证combined_metadata的set列包含所有需要着色的集合名称,确保每个集合都能匹配到对应的颜色属性

内容的提问来源于stack exchange,提问作者cterry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:42:03