2012-03-22 15 views
10

No encuentro una manera de pedirle a ggplot2 que muestre un nivel vacío en un diagrama de caja sin imputar mi dataframe con los valores perdidos reales. Aquí es reproducible código:geom_boxplot() desde ggplot2: forzando a que aparezca un nivel vacío

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

así que supongo que me falta algo. Esto no es un problema cuando se trata de un experimento equilibrado donde estos datos faltantes pueden ser explícitos en el marco de datos. Pero con los datos observados en una cohorte, por ejemplo, significa imputar los datos con valores faltantes para combinaciones no observadas ... Gracias por su ayuda.

Respuesta

11

Puede controlar las interrupciones en una función de escala adecuada, en este caso scale_x_discrete. Asegúrese de que utiliza el argumento 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


me gusta hacer mi manipulación de datos antes de enviarlo a ggplot. Creo que esto hace que el código sea más legible. Así es como lo haría yo mismo, pero los resultados son los mismos. Tenga en cuenta, sin embargo, que la escala ggplot se hace mucho más sencillo, ya que no tiene que especificar los descansos:

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) 
+0

Muchas gracias. Esto responde perfectamente mi pregunta. Como principiante de ggplot2, me quedé cegado al pensar que el problema provenía de aes de geom_boxplot() y, por lo tanto, no pude encontrar una solución. Obviamente necesito aprender más sobre ggplot. Gracias de nuevo –

Cuestiones relacionadas