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

ComplexUpset技术问询:如何为集合与交集自动分配调色板

问题:ComplexUpset自动化设置集合颜色

我正在学习使用ComplexUpset,它非常实用,用它制作的UpSet图表清晰易懂。由于无法分享实际数据集,这里以movies数据集为例。不同时间点的类型集合会变化(比如1997年只有喜剧、动作、动画,1998年新增爱情、剧情)。目前我手动为集合设置颜色,但这种方式在处理不同时间点的数据时会出问题——因为我的脚本里UpSet的交叉部分是用colnames()控制的,能自动匹配当前分析对象,所以希望让R自动选择色阶,代替手动指定颜色。

当前手动设置颜色的代码:

upset(
  movies,
  colnames(movies)[18:20],
  name='genre',
  width_ratio=0.1,
  matrix=(
    intersection_matrix(geom=geom_point(shape='circle filled', size=3))
  ),
  queries=list(
    upset_query(set='Action', fill='red'),
    upset_query(set='Animation', fill='blue'),
    upset_query(set='Comedy', fill='yellow')
  )
)

我已经给区分交叉数量的垂直条实现了自动色阶设置,代码如下:

base_annotations=list(
         'Intersection size'=intersection_size(
           mapping=aes(fill=`Groups Count`)
         ) +
           scale_fill_brewer(palette = "Set2") + 
           theme(legend.position = "right",
                 legend.title = element_text(size = 8,
                                             family = "Trebuchet MS"),
                 element_text(family="Trebuchet MS"))
)

想请教:能否将类似scale_fill_brewer()的设置应用到水平条和圆形交叉点上?


解决方案

当然可以实现,不需要依赖queries手动指定颜色,直接通过修改集合元素和矩阵点的映射,配合颜色比例尺就能自动适配不同的集合。

1. 给水平集合条设置自动色阶

水平条对应的是set_sizes()组件,你可以给它添加fill映射,绑定集合名称,再加上scale_fill_brewer():

set_sizes(
  mapping = aes(fill = set)
) + scale_fill_brewer(palette = "Set2")

2. 给交叉矩阵的圆形点设置自动色阶

交叉矩阵的点可以通过intersection_matrix()的mapping参数绑定集合名称,再添加颜色比例尺。注意这里点的填充色需要用fill(因为你用的是shape='circle filled'):

intersection_matrix(
  geom = geom_point(shape='circle filled', size=3),
  mapping = aes(fill = set)
) + scale_fill_brewer(palette = "Set2")

完整整合后的代码

把这两部分整合到你的upset()函数里,去掉原来手动的queries列表,最终代码如下:

upset(
  movies,
  colnames(movies)[18:20],
  name='genre',
  width_ratio=0.1,
  matrix = intersection_matrix(
    geom = geom_point(shape='circle filled', size=3),
    mapping = aes(fill = set)
  ) + scale_fill_brewer(palette = "Set2"),
  set_sizes = set_sizes(
    mapping = aes(fill = set)
  ) + scale_fill_brewer(palette = "Set2"),
  base_annotations = list(
    'Intersection size' = intersection_size(
      mapping = aes(fill=`Groups Count`)
    ) +
      scale_fill_brewer(palette = "Set2") + 
      theme(
        legend.position = "right",
        legend.title = element_text(size = 8, family = "Trebuchet MS"),
        element_text(family="Trebuchet MS")
      )
  )
)

说明

  • 这样设置后,不管你的集合数量或种类怎么变化,R都会自动从指定的调色板(这里是Set2)中分配对应颜色,无需手动修改。
  • 如果想统一所有元素的调色板,确保scale_fill_brewer()的palette参数一致即可,也可以换成其他ggplot2支持的颜色比例尺,比如scale_fill_viridis_d()等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:33:15