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