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

