R语言 geom_boxplot():强制显示空级别

bcs8qyzn  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(173)

我找不到一种方法来要求ggplot2在箱线图中显示一个空的水平,而不输入我的数据框与实际的缺失值。下面是可复制的代码:

# 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()

所以我想我错过了什么。当处理平衡实验时,这不是问题,其中这些丢失的数据可能在 Dataframe 中是显式的。但是,例如,对于队列中的观察数据,这意味着对未观察到的组合的缺失值进行数据插补。

tf7tbtn2

tf7tbtn21#

我们可以用一个合适的比例函数来控制中断,在本例中为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)

我喜欢在将数据发送到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)

相关问题