2012-03-22 16 views
10

Non riesco a trovare un modo per chiedere a ggplot2 di mostrare un livello vuoto in un boxplot senza imputare il mio dataframe con valori mancanti reali. Ecco il codice riproducibili:geom_boxplot() da ggplot2: forzatura di un livello vuoto per apparire

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

quindi credo che mi manca qualcosa. Questo non è un problema quando si tratta di un esperimento equilibrato in cui questi dati mancanti potrebbero essere espliciti nel dataframe. Ma con i dati osservati in una coorte, ad esempio, significa imputare i dati con valori mancanti per le combinazioni inosservate ... Grazie per il vostro aiuto.

risposta

11

È possibile controllare le interruzioni in una funzione di scala adatta, in questo caso scale_x_discrete. Assicurarsi di utilizzare l'argomento 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


mi piace fare la mia manipolazione dei dati in anticipo di inviarlo alla ggplot. Penso che questo renda il codice più leggibile. Questo è come lo farei io stesso, ma i risultati sono gli stessi. Si noti, tuttavia, che la scala ggplot diventa molto più semplice, dal momento che non è necessario specificare le interruzioni:

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

Grazie mille. Questo risponde perfettamente alla mia domanda. Come principiante di ggplot2, mi sono reso cieco pensando che il problema provenisse da aes di geom_boxplot() e quindi non sono riuscito a trovare una soluzione. Ovviamente ho bisogno di saperne di più su ggplot. Grazie ancora –

Problemi correlati