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
相关产品推荐
相关产品推荐

