如何移除UpSet图的Set Size子图并在柱状图顶部添加百分比标注
解决UpSetR绘图的两个需求:移除Set Size子图 + 添加百分比标注
1. 移除Set Size子图
直接在upset()函数中设置参数set_size.show = FALSE即可,该参数控制是否显示左侧的Set Size子图。同时可通过text.scale参数调整文本大小,适配去掉子图后的布局,保证图表可读性。
2. 添加观测数+百分比标注
需要先计算每个交集的统计数据,再通过queries参数将标注添加到对应柱状图顶部:
- 转换集合数据为UpSet格式矩阵,统计每个交集的元素数量
- 计算所有出现在至少一个集合中的去重元素总数,以此为基数计算每个交集的百分比
- 构造包含观测数和百分比的标注文本,循环添加到每个交集柱状图顶部
完整代码如下:
require(tidyverse) require(UpSetR) # 加载数据并构造集合列表 temp_movies <- ggplot2movies::movies to_UpSet <- list( Action = filter(temp_movies, Action == 1)$title, Comedy = filter(temp_movies, Comedy == 1)$title, Drama = filter(temp_movies, Drama == 1)$title, Romance = filter(temp_movies, Romance == 1)$title ) # 转换为UpSet数据格式并计算交集统计 upset_data <- fromList(to_UpSet) freq_table <- upset_data %>% mutate(across(everything(), as.factor)) %>% count(Action, Comedy, Drama, Romance, name = "count") %>% filter(count > 0) # 计算总元素数(去重后的所有集合元素) total_elements <- length(unique(unlist(to_UpSet))) # 生成标注文本:观测数 + 百分比 freq_table <- freq_table %>% mutate(percent = round((count / total_elements) * 100, 1), label = str_glue("{count}\n({percent}%)")) %>% arrange(desc(count)) # 按频率排序,匹配UpSet默认排序 # 绘制最终图表 upset(upset_data, order.by = "freq", set_size.show = FALSE, # 移除Set Size子图 mainbar.y.label = "交集元素数量", sets.x.label = "电影类型", text.scale = c(1.2, 1.2, 1, 1, 1.2, 1), # 调整各部分文本大小 # 添加自定义标注 queries = lapply(1:nrow(freq_table), function(i) { # 获取当前交集对应的集合名称 current_sets <- colnames(upset_data)[which(c(freq_table$Action[i], freq_table$Comedy[i], freq_table$Drama[i], freq_table$Romance[i]) == 1)] list( query = intersects, params = list(current_sets), color = "black", text = freq_table$label[i], type = "text", location = "top" ) }) )
说明
- 百分比计算基于所有出现在至少一个集合中的去重元素总数,符合维恩图的常规百分比展示逻辑
queries参数通过循环为每个交集生成文本标注,location = "top"确保标注显示在柱状图顶部- 调整
text.scale参数可根据需求修改图表各部分文本大小,提升报告可读性
内容的提问来源于stack exchange,提问作者kaboo
相关产品推荐
相关产品推荐

