ggplot2 offset scatterplot points

jslefche picture jslefche · Jul 25, 2011 · Viewed 11.3k times · Source

I have two sets of points with error bars. I would like to offset the second so it's displayed slightly down from the first set, so that it doesn't obscure the original.

Here is a mock data set:

x=runif(4,-2,2)
y=c("A","B","C","D")
upper=x+2
lower=x-2
x_1=runif(4,-1,3)
upper_1=x_1+1
lower_1=x_1-2

Here is the code that I used to produce the plot:

qplot(x,y)+
  geom_point(size=6)+
  geom_errorbarh(aes(xmax=upper,xmin=lower),size=1)+
  geom_point(aes(x_1,y),size=6,pch=8,vjust=-1,col="grey40")+
  geom_errorbarh(aes(xmax=upper_1,xmin=lower_1),size=1,col="grey40")

And here is the plot:

scatterplot

I would like the grey asterisks and associated errors bars to be plotted a hair below the black circles and associated error bars. I would transform the data set, but the Y-axis is categorical variables.

Answer

joran picture joran · Jul 25, 2011

Using Richie's reorganization of your data, this is also possible purely within ggplot, without having to mess with the axis:

dodge <- position_dodge(width=0.5)  
p <- ggplot(dfr,aes(x=y,y=x,colour=type)) + 
        geom_point(aes(shape=type),position=dodge) +
        geom_errorbar(aes(ymax=upper,ymin=lower),position = dodge) + 
        scale_colour_manual(values = c('gray','black')) +
        scale_shape_manual(values = c(8,19)) +
        coord_flip() + 
        opts(legend.position="none")

which gives me this plot:

enter image description here

Note: Since version 0.9.2 opts has been replaced by theme:

+ theme(legend.position = "none")