Search code examples
rggplot2position-dodge

ggplot2 - jitter and position dodge together


I am trying to recreate a figure from a GGplot2 seminar http://dl.dropbox.com/u/42707925/ggplot2/ggplot2slides.pdf.

In this case, I am trying to generate Example 5, with jittered data points subject to a dodge. When I run the code, the points are centered around the correct line, but have no jitter.

Here is the code directly from the presentation.

set.seed(12345)
hillest<-c(rep(1.1,100*4*3)+rnorm(100*4*3,sd=0.2),
       rep(1.9,100*4*3)+rnorm(100*4*3,sd=0.2))
rep<-rep(1:100,4*3*2)
process<-rep(rep(c("Process 1","Process 2","Process 3","Process 4"),each=100),3*2)
memorypar<-rep(rep(c("0.1","0.2","0.3"),each=4*100),2)
tailindex<-rep(c("1.1","1.9"),each=3*4*100)
ex5<-data.frame(hillest=hillest,rep=rep,process=process,memorypar=memorypar, tailindex=tailindex)
stat_sum_df <- function(fun, geom="crossbar", ...) {stat_summary(fun.data=fun, geom=geom, ...) }

dodge <- position_dodge(width=0.9) 
p<- ggplot(ex5,aes(x=tailindex ,y=hillest,color=memorypar)) 
p<- p + facet_wrap(~process,nrow=2) + geom_jitter(position=dodge) +geom_boxplot(position=dodge)  
p

Solution

  • EDIT: There is a better solution with ggplot2 version 1.0.0 using position_jitterdodge. See @Didzis Elferts' answer. Note that dodge.width controls the width of the dodging and jitter.width controls the width of the jittering.

    I'm not sure how the code produced the graph in the pdf.

    But does something like this get you close to what you're after?

    I convert tailindex and memorypar to numeric; add them together; and the result is the x coordinate for the geom_jitter layer. There's probably a more effective way to do it. Also, I'd like to see how dodging geom_boxplot and geom_jitter, and with no jittering, will produce the graph in the pdf.

    library(ggplot2)
    dodge <- position_dodge(width = 0.9)
    ex5$memorypar2 <- as.numeric(ex5$tailindex) + 
      3 * (as.numeric(as.character(ex5$memorypar)) - 0.2) 
    
    p <- ggplot(ex5,aes(x=tailindex , y=hillest)) +
       scale_x_discrete() +
       geom_jitter(aes(colour = memorypar, x = memorypar2), 
         position = position_jitter(width = .05), alpha = 0.5) +
       geom_boxplot(aes(colour = memorypar), outlier.colour = NA, position = dodge) +
       facet_wrap(~ process, nrow = 2)
    p
    

    enter image description here