geom_boxplot () из ggplot2: заставляет появляться пустой уровень - PullRequest
10 голосов
/ 22 марта 2012

Я не могу найти способ попросить 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()

Значит, я что-то упустил. Это не проблема при работе со сбалансированным экспериментом, в котором эти отсутствующие данные могут быть явными в кадре данных. Но с данными наблюдений в когорте, например, это означает вложение данных с пропущенными значениями для ненаблюдаемых комбинаций ... Спасибо за вашу помощь.

1 Ответ

12 голосов
/ 22 марта 2012

Вы можете контролировать разрывы в подходящей функции масштабирования, в данном случае 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)

enter image description here


Мне нравится манипулировать данными перед отправкой на 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)
...