ggplot2:强制空的二级类别

r2e*_*ans 9 r ggplot2 boxplot

我正试图为多级分组箱图保留"空白空间".

set.seed(42)
n <- 100
dat <- data.frame(x=runif(n),
                  cat1=sample(letters[1:4], size=n, replace=TRUE),
                  cat2=sample(LETTERS[1:3], size=n, replace=TRUE))
ggplot(dat, aes(cat1, x)) + geom_boxplot(aes(fill=cat2))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果我强制其中一个组为空:

dat <- subset(dat, ! (cat1 == 'b' & cat2 == 'B'))
table(dat$cat1, dat$cat2)
##    
##      A  B  C
##   a  9  9  7
##   b  8  0  5
##   c 13 11  6
##   d 11 10  5
ggplot(dat, aes(cat1, x)) + geom_boxplot(aes(fill=cat2))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

第二组"b"现在扩展到填补空间.我想要的是:

在此输入图像描述

SO 9818835(强制出现一个空的级别)在顶级工作正常,但我无法弄清楚如何使它适用于第二级别的类别.在scale_x_discrete(...),我尝试设置:

  • breaks=letters[1:4]
  • breaks=LETTERS[1:3]
  • breaks=list(letters[1:4], LETTERS[1:3]) (刺伤)
  • breaks=NULL
  • breaks=func在哪里func <- function(x, ...) { browser(); 1; }进行故障排除; 它只提供letters[1:4],从未提示第二级

使用interactions(letters[1:4], LETTERS[1:3])仍然不会留空空间.我尝试了一种解决方法,通过注入一个越界x值并将其强制离开屏幕scale_y_continuous(limits),但ggplot2对我来说太聪明并再次缩小差距.

是否优雅(即ggplot2机制中的"正确" )解决方案?

akh*_*med 7

可能coord_cartesian是您正在寻找的解决方案?

它将放大并且不会试图"智取"数据 scale_y_continuous

library(dplyr)
library(ggplot2)

set.seed(42)
n <- 100
dat <- data.frame(x=runif(n),
                  cat1=sample(letters[1:4], size=n, replace=TRUE),
                  cat2=sample(LETTERS[1:3], size=n, replace=TRUE))

LARGE_VALUE <- 2

dat <- dat %>%
  mutate(x = ifelse(cat1 == 'b' & cat2 == 'B', 
                    LARGE_VALUE,
                    x))

ggplot(dat, aes(cat1, x)) + 
  geom_boxplot(aes(fill=cat2)) + 
  coord_cartesian(ylim = c(0,1))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述