如何在ggupset中显示未观测集合?含示例与尝试方案
在ggupset中显示未观测集合并调整标签顺序
要实现显示未观测的集合B,同时让标签按A、B、C的顺序排列,需要先将目标列转换为包含所有预期集合的因子,再配合scale_x_upset的参数设置,具体步骤如下:
解决方案代码
library(ggplot2) library(ggupset) library(tibble) df <- data.frame(x = I(list(c("A", "C"), "A", "C"))) # 将x转换为因子,指定所有需要的集合作为水平(包括未观测的B) df$x <- factor(df$x, levels = I(list("A", "B", "C", c("A", "C")))) # 绘图,指定sets参数控制集合标签顺序 df %>% ggplot(aes(x = x)) + geom_bar(stat = 'count') + scale_x_upset(sets = c("A", "B", "C"))
原理说明
- 直接使用
scale_x_upset(sets = ...)不会自动添加未观测的集合,必须先将x列转换为包含所有目标集合的因子,确保未观测的集合(如B)被纳入因子水平中。 - 因子水平的顺序决定了x轴上集合的显示顺序,配合
scale_x_upset(sets = c("A", "B", "C"))就能让顶部的集合标签按预期顺序排列。 - 转换为因子后,未观测的集合会显示计数为0的柱子,若想隐藏0值柱子但保留标签,可过滤掉对应行后再绘图,但需确保因子水平仍包含该集合。
补充:隐藏0值柱子但保留标签
如果不需要显示B的0值柱子,只保留顶部的标签,可调整如下:
df %>% filter(x != list("B")) %>% ggplot(aes(x = x)) + geom_bar(stat = 'count') + scale_x_upset(sets = c("A", "B", "C"))
内容的提问来源于stack exchange,提问作者LMc
相关产品推荐
相关产品推荐

