R语言Complex Upset绘图:如何实现先按度数降序、组内按交集大小降序排序?
解决Complex Upset图的排序需求:先度数降序,同度数内交集大小降序
我来帮你搞定这个排序问题!你当前的代码里,sort_intersections_by=c('degree', 'cardinality')是默认按升序处理这两个字段的,所以会先按度数从0到4排,同度数内交集大小也是升序。要实现先度数降序、再同度数内交集大小降序的效果,只需要用dplyr::desc()来指定排序方向就行。
修改后的完整代码
library(tidyverse) library(ComplexUpset) movies = as.data.frame(ggplot2movies::movies) movies[movies$mpaa == '', 'mpaa'] = NA movies = na.omit(movies) genres = colnames(movies)[18:24] query_by_degree = function(data, groups, params_by_degree, ...) { intersections = unique(upset_data(data, groups)$plot_intersections_subset) lapply( intersections, FUN=function(x) { members = ComplexUpset:::get_intersection_members(x)[[1]] degree = as.character(ComplexUpset:::calculate_degree(x)) if (!(degree %in% names(params_by_degree))) { stop( paste('Missing specification of params for degree', degree) ) } args = c( list(intersect=members, ...), params_by_degree[[degree]] ) do.call(upset_query, args) } ) } upset( movies, genres, width_ratio=0.1, sort_intersections="descending", sort_sets="ascending", # 核心修改:用dplyr::desc指定降序排列规则 sort_intersections_by=c(dplyr::desc('degree'), dplyr::desc('cardinality')), queries=query_by_degree( movies, genres, params_by_degree=list( '1'=list(color='red', fill='red'), '2'=list(color='purple', fill='purple'), '3'=list(color='blue', fill='blue'), '4'=list(color='green', fill='green'), '0'=list(color='orange', fill='orange') ), only_components=c("intersections_matrix", "Intersection size") ) )
关键修改说明
- 把原来的
sort_intersections_by=c('degree', 'cardinality')替换成c(dplyr::desc('degree'), dplyr::desc('cardinality')):dplyr::desc('degree')会让度数从高到低(4→3→2→1→0)排列- 第二个
dplyr::desc('cardinality')确保在同一个度数分组里,交集大小大的排在前面
- 保留
sort_intersections="descending"是为了和复合排序逻辑保持一致,实际上sort_intersections_by的优先级更高,这个参数也可以不用调整,但保留不影响效果。
这样修改后,图表就会先按度数降序排列各组,在每个度数组内再按交集大小降序展示,完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者acircleda
相关产品推荐
相关产品推荐

