2012-03-22 3 views
10

내 데이터 프레임을 실제 누락 값으로 변환하지 않고 gplot2에 boxplot에 빈 레벨을 표시하도록 요청하는 방법을 찾을 수 없습니다. geom_boxplot() from 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() 

그래서 내가 뭔가를 놓친 것 같아 : 여기에 재현 코드입니다. 이러한 누락 된 데이터가 데이터 프레임에서 명시적일 수있는 균형 잡힌 실험을 처리 할 때는 문제가되지 않습니다. 그러나 코호트에서 관찰 된 데이터를 예로 들면 관찰되지 않은 조합에 대해 누락 된 값으로 데이터를 전가하는 것을 의미합니다 ... 도움을 주셔서 감사합니다.

답변

11

적절한 축척 기능으로 나누기를 제어 할 수 있습니다 (이 경우 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로 전송하기에 앞서 내 데이터 조작을 할 좋아

. 나는 이것이 코드를 더 읽기 쉽게 만든다고 생각한다. 이것은 내가 어떻게 그것을 할 것인가이지만 결과는 같습니다. 단, 휴식 시간을 지정할 필요가 없으므로 크기가 훨씬 간단합니다.

+0

고맙습니다. 이것은 내 질문에 완벽하게 대답한다. ggplot2 초보자로서, 문제가 geom_boxplot()의 문제에서 비롯된 것으로 생각하여 솔루션을 찾지 못했습니다. 분명히 ggplot에 대해 더 자세히 알아야합니다. 다시 한 번 감사드립니다. –

관련 문제