2

this must be a FAQ, but I can't find an exactly similar example in the other answers (feel free to close this if you can point a similar Q&A). I'm still a newbie with ggplot2 and can't seem to wrap my head around it quite so easily.

I have 2 data.frames (that come from separate mixed models) and I'm trying to plot them both into the same graph. The data.frames are:

newdat
      id   Type         pred        SE
       1      1     15.11285 0.6966029
       2      1     13.68750 0.9756909
       3      1     13.87565 0.6140860
       4      1     14.61304 0.6187750
       5      1     16.33315 0.6140860
       6      1     16.19740 0.6140860
       1      2     14.88805 0.6966029
       2      2     13.46270 0.9756909
       3      2     13.65085 0.6140860
       4      2     14.38824 0.6187750
       5      2     16.10835 0.6140860
       6      2     15.97260 0.6140860

and

newdat2
      id                pred        SE
       1            14.98300 0.6960460
       2            13.25893 0.9872502
       3            13.67650 0.6150701
       4            14.39590 0.6178266
       5            16.37662 0.6171588
       6            16.08426 0.6152017

As you can see, the second data.frame doesn't have Type, whereas the first does, and therefore has 2 values for each id.

What I can do with ggplot, is plot either one, like this:

fig1

http://i.imgur.com/br7yZYD.png

fig2

http://i.imgur.com/1ikMPy6.png

As you can see, in fig 1 ids are stacked by Type on the x-axis to form two groups of 6 ids. However, in fig 2 there is no Type, but instead just the 6 ids.

What I would like to accomplish is to plot fig2 to the left/right of fig1 with similar grouping. So the resulting plot would look like fig 1 but with 3 groups of 6 ids.

The problem is also, that I need to label and organize the resulting figure so that for newdat the x-axis would include a label for "model1" and for newdat2 a label for "model2", or some similar indicator that they are from different models. And to make things even worse, I need some labels for Type in newdat.

My (hopefully) reproducible (but obviously very bad) code for fig 1:

library(ggplot2)
pd <- position_dodge(width=0.6)
ggplot(newdat,aes(x=Type,y=newdat$pred,colour=id))+
  geom_point(position=pd, size=5)
geom_linerange(aes(ymin=newdat$pred-1.96*SE,ymax=newdat$pred+1.96*SE), position=pd, size=1.5, linetype=1) +
  theme_bw() +
  scale_colour_grey(start = 0, end = .8, name="id") +
  coord_cartesian(ylim=c(11, 18)) +
  scale_y_continuous(breaks=seq(10, 20, 1)) +
  scale_x_discrete(name="Type", limits=c("1","2"))

Code for fig 2 is identical, but without the limits in the last line and with id defined for x-axis in ggplot(aes())

As I understand it, defining stuff at ggplot() makes that stuff "standard" along the whole graph, and I've tried to remove the common stuff and separately define geom_point and geom_linerange for both newdat and newdat2, but no luck so far... Any help is much appreciated, as I'm completely stuck.

  • We can merge the data and assign Type 3, and plot as one ggplot, or we can use `cowplot` package, to plot 2 ggplots side by side, yaxis aligned. – zx8754 Mar 07 '16 at 16:33

1 Answers1

4

How about adding first adding some new variables to each dataset and then combining them:

newdat$model <- "model1"

newdat2$model <- "model2"
newdat2$Type <- 3

df <- rbind(newdat, newdat2)
# head(df)

Then we can plot with:

library(ggplot2)

ggplot(df, aes(x = interaction(model, factor(Type)), y = pred, color = factor(id))) +
  geom_point(position = position_dodge(width = 0.6), size = 5) +
  geom_linerange(aes(ymin = pred - 1.96 * SE, ymax = pred + 1.96 * SE),
                 position = position_dodge(width = 0.6), 
                 size = 1.5, linetype = 1)

Plot 01

Alternatively, you pass an additional aesthetic to geom_linerange to further delineate the model type:

ggplot(df, aes(x = interaction(model, factor(Type)), y = pred, color = factor(id))) +
  geom_point(position = position_dodge(width = 0.6), size = 5) +
  geom_linerange(aes(ymin = pred - 1.96 * SE, ymax = pred + 1.96 * SE, linetype = model),
                 position = position_dodge(width = 0.6), 
                 size = 1.5)

Plot 02

Finally, you may want to considered facets:

ggplot(df, aes(x = interaction(model, factor(Type)), y = pred, color = factor(id))) +
  geom_point(position = position_dodge(width = 0.6), size = 5) +
  geom_linerange(aes(ymin = pred - 1.96 * SE, ymax = pred + 1.96 * SE),
                 position = position_dodge(width = 0.6), 
                 size = 1.5) +
  facet_wrap(~ id)

Plot 03 - Facets

JasonAizkalns
  • 20,243
  • 8
  • 57
  • 116