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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:32:50