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

如何在UpSetR绘图中移除无交集的孤立变量?

解决方案

针对你的需求,分两种场景给出修改方案:


场景1:移除完全没有和其他流派产生交集的流派(即该流派下所有电影都只属于这一个流派,没有跨流派的电影)

先预处理数据,筛选出至少存在一部跨流派电影的流派,再传入upset()函数:

library(UpSetR)

# 读取数据
movies <- read.csv(system.file("extdata", "movies.csv", package = "UpSetR"), header = TRUE, sep = ";")

# 指定初始要检查的流派列表
target_genres <- c("Action", "Adventure", "Comedy", "Drama", "Mystery",  "Thriller", "Romance", "War", "Western")

# 筛选出至少有跨流派电影的流派
valid_genres <- sapply(target_genres, function(genre) {
  # 找到当前流派的所有电影
  genre_movies <- movies[movies[[genre]] == TRUE, ]
  # 检查这些电影是否有同时属于其他流派的情况
  any(rowSums(genre_movies[, setdiff(target_genres, genre)]) > 0)
}) %>% 
  names(.)[.]

# 用筛选后的流派绘图
upset(movies, sets = valid_genres, order.by = "freq")

场景2:保留所有流派,但不显示仅单个流派的交集条形(只展示两个及以上流派的交集)

通过筛选出包含至少两个流派的有效交集,再指定给intersections参数:

library(UpSetR)
library(purrr) # 用于生成组合

movies <- read.csv(system.file("extdata", "movies.csv", package = "UpSetR"), header = TRUE, sep = ";")

target_genres <- c("Action", "Adventure", "Comedy", "Drama", "Mystery",  "Thriller", "Romance", "War", "Western")

# 生成所有包含2个及以上流派的组合
all_multi_combinations <- map(2:length(target_genres), function(k) {
  combn(target_genres, k, simplify = FALSE)
}) %>% unlist(recursive = FALSE)

# 筛选出有实际电影存在的交集
valid_intersections <- all_multi_combinations[sapply(all_multi_combinations, function(comb) {
  sum(rowSums(movies[, comb]) == length(comb)) > 0
})]

# 绘图,仅展示多流派交集
upset(movies, sets = target_genres, intersections = valid_intersections, order.by = "freq")

补充说明

  • 场景1是从根源上移除无交叉的流派,适合你明确不想让这类流派出现在图表的集合轴上;
  • 场景2保留所有流派,但只展示跨流派的交集,适合需要保留完整流派列表但只想看组合交集的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:18:36