r - Combine plots with grid.arrange and adjust plot size and axis label -


i want combine 2 ggplots grid.arrange 1 general legend. managed combine 2 legends small trick, since removed legend first plot, 1 broader after grid.arrange, of course. how can both plotting areas same size? , have 1 common x axis label centered below both plots. possible grid.arrange? know, similar questions have been answered before, i'm still newbie r , solutions complicated or cannot fit them data.

so here 2 datasets:

testxy   sn strain     est     low      1      xy 11.6751 11.1480 12.2021 2  b     xy 11.4211 11.1108 11.7314 3  c     xy  2.6603  2.4291  2.8915 4  d     xy  4.5503  4.2972  4.8034  testyz   sn strain     est     low      5      yz 22.1761 21.5136 22.8387 6  c     yz 21.4829 21.0251 21.9408 7  b     yz 19.3294 18.8950 19.7639 8  d     yz 19.9990 19.3934 20.6047 

and code have far. it's close want, close:

p1<-ggplot(data=testxy, aes(colour=strain, x=sn, y=est))+ theme(panel.background = element_rect(fill = 'white', colour = 'black'))+ theme(legend.position="none")+ theme(axis.title.x = element_text(size = rel(1.5), vjust=-0.1),  axis.title.y = element_text(size = rel(1.5), vjust=1), axis.text.y = element_text(size = rel(1.4)), axis.text.x = element_text(hjust = 1, size = rel(1.5)),plot.title = element_text(size = rel(2.5), lineheight=1, face="bold"))+       theme(plot.margin=unit(c(5,5,5,5),"mm"))+       labs(x="treatment", y="integral", title="xy")+       scale_colour_manual(name="strain", values=c(xy="blue"))+       theme(strip.text.x = element_text(size=12, face="bold"), strip.background = element_rect(colour="black", fill="white"))+       geom_point(aes(color="xy"), size=5, alpha=0.1, shape=16)+       geom_errorbar(aes(ymin=low, ymax=up, width=0.2), colour="deepskyblue", size=0.8)+       scale_y_continuous(breaks=seq(5,20,5), limits=c(2,23.5))  p2<-ggplot(data=testyz, aes(colour=strain, x=sn, y=est))+   theme(panel.background = element_rect(fill = 'white', colour = 'black'))+   theme(legend.position="right")+   theme(axis.title.x = element_text(size = rel(1.5), vjust=-0.1), axis.ticks.y = element_blank(), axis.text.y = element_blank(), axis.text.x = element_text(hjust = 1, size = rel(1.5)), plot.title = element_text(size = rel(2.5), lineheight=1, face="bold"))+   theme(plot.margin=unit(c(5,5,5,5),"mm"))+   labs(x="treatment", y=null, title="yz")+   scale_colour_manual(name="strain", values=c(yz="green", xy="blue"))+   theme(strip.text.x = element_text(size=12, face="bold"), strip.background = element_rect(colour="black", fill="white"))+   geom_point(aes(color="yz"), size=5, alpha=0.1, shape=16)+   geom_point(aes(color="xy"), size=0)+   geom_errorbar(aes(ymin=low, ymax=up, width=0.2), colour="green", size=0.8)+   scale_y_continuous(breaks=seq(5,20,5), limits=c(2,23.5))+   scale_x_discrete(limits=c("a", "c", "b", "d"))  grid.arrange(p1,p2, ncol=2) 

i tried facetting before. looks good, unfortunately, need change order of levels on x axes. so, think facetting doesn't work me.

i hope can me.

cheers anne

you should use facetting:

testxy <- read.table(text = "  sn strain     est     low      1      xy 11.6751 11.1480 12.2021 2  b     xy 11.4211 11.1108 11.7314 3  c     xy  2.6603  2.4291  2.8915 4  d     xy  4.5503  4.2972  4.8034", header = true)  testyz <- read.table(text = "   sn strain     est     low      5      yz 22.1761 21.5136 22.8387 6  c     yz 21.4829 21.0251 21.9408 7  b     yz 19.3294 18.8950 19.7639 8  d     yz 19.9990 19.3934 20.6047", header = true)  test <- rbind(cbind(testxy, fac = "xy"),               cbind(testyz, fac = "yz"))   test$sn1 <- interaction(test$sn, test$fac) test$sn1 <- ordered(test$sn1, levels = test$sn1)   ggplot(data=test, aes(colour=strain, x=sn1, y=est)) +   geom_point() +    facet_wrap(~ fac, scales = "free_x") +   scale_x_discrete(labels = setnames(as.character(test$sn), as.character(test$sn1)))  

resulting plot

however, not plot, since reader not notice x-axes different.


Comments