来自ggplot2的geom_boxplot():强制显示空白级别

Mar*_*c C 10 r ggplot2 boxplot r-factor

我找不到一种方法来让ggplot2在一个boxplot中显示一个空的级别,而不会将我的数据帧与实际的缺失值相混淆.这是可重现的代码:

# fake data
dftest <- expand.grid(time=1:10,measure=1:50)
dftest$value <- rnorm(dim(dftest)[1],3+0.1*dftest$time,1)

# and let's suppose we didn't observe anything at time 2

# doesn't work even when forcing with factor(..., levels=...)
p <- ggplot(data=dftest[dftest$time!=2,],aes(x=factor(time,levels=1:10),y=value))
p + geom_boxplot()

# only way seems to have at least one actual missing value in the dataframe
dftest2 <- dftest
dftest2[dftest2$time==2,"value"] <- NA
p <- ggplot(data=dftest2,aes(x=factor(time),y=value))
p + geom_boxplot()
Run Code Online (Sandbox Code Playgroud)

所以我想我错过了一些东西.在处理平衡实验时,这不是问题,因为这些缺失数据可能在数据帧中是明确的.但是,例如,在一个队列中观察到的数据,这意味着对未观察到的组合缺少值的数据进行估算...感谢您的帮助.

And*_*rie 12

在这种情况下,您可以在合适的比例函数中控制中断scale_x_discrete.确保使用参数drop=FALSE:

p <- ggplot(data=dftest[dftest$time!=2,],aes(x=factor(time,levels=1:10),y=value))
p + geom_boxplot() + 
  scale_x_discrete("time", breaks=factor(1:10), drop=FALSE)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


我喜欢在发送之前进行数据操作ggplot.我认为这使代码更具可读性.这就是我自己做的方式,但结果是一样的.但是请注意,ggplot比例变得更简单,因为您不必指定中断:

dfplot <- dftest[dftest$time!=2, ]
dfplot$time <- factor(dfplot$time, levels=1:10)

ggplot(data=dfplot, aes(x=time ,y=value)) +
    geom_boxplot() + 
    scale_x_discrete("time", drop=FALSE)
Run Code Online (Sandbox Code Playgroud)