3
votes

I have trouble specifying the grid layout dimensions in ggplot in order to stick four plots in a 2x2 plot (2 columns, 2 rows). I have an R code that stick the first 2 plots in one row and the 3rd and 4th plots in separate rows (total of 3 rows) as outlined in the figure below. output of the R code. This plot was generated using this simple R code example:

setwd("...")
library(ggplot2)
library(grid)
x1 <- c(seq(1,20,1))
y1 <- c(seq(50,69,1))

df <- data.frame(x1,y1)
df$DOSE[df$x1<= 10] <- "50 mg"
df$DOSE[df$x1 > 10] <- "100 mg"


filename <- "test_plot.png"
png(filename, width=700, height=900, pointsize=14)

#4 ggplot2 graphs in a grid layout
vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)
grid.newpage()
pushViewport(viewport(layout = grid.layout(4,4)))

#Plot 1
plotobj1 <- NULL
plotobj1 <-  ggplot(data=df)
plotobj1 <- plotobj1 + geom_point(aes(x=x1, y=y1,colour=DOSE), shape=1, size=3)
plotobj1  <-  plotobj1 + theme(legend.position="none")
print(plotobj1, vp=vplayout(1:2,1:2))
#Plot 2
plotobj2 <- NULL
plotobj2 <-  ggplot(df)
plotobj2 <- plotobj2 + geom_point(aes(x=x1, y=y1,colour=DOSE), shape=1, size=3)
plotobj2  <-  plotobj2 + theme(legend.position="none")
print(plotobj2, vp=vplayout(1:2,3:4))
#Plot 3 
plotobj3 <- NULL
plotobj3 <-  ggplot(df)
plotobj3 <- plotobj3 + geom_point(aes(x=x1, y=y1, colour=DOSE), shape=1, size=3)
plotobj3  <-  plotobj3 + scale_colour_brewer(name="Dose", palette="Set1")
print(plotobj3, vp=vplayout(3,2:4)) 
#Plot 4   CWRES vs PRED
plotobj4 <- NULL
plotobj4 <-  ggplot(df)
plotobj4 <- plotobj4 + geom_point(aes(x=x1, y=y1, colour=DOSE), shape=1, size=3)
plotobj4  <-  plotobj4 + scale_colour_brewer(name="Dose", palette="Set1")
print(plotobj4, vp=vplayout(4,2:4))

dev.off()

I had trouble modifying the dimensions and plot positions. I want to have the 3rd and 4th plots into one row (similar to the first two plots) so I have a smaller plot acceptable for publication.

1
You ssem to have the wrong row and columns indicated: try changing the relevant lines to print(plotobj3, vp=vplayout(3:4,1:2)) and print(plotobj4, vp=vplayout(3:4,3:4))user20650
Might be easier to use grid.arrange from the gridExtra package. (eg grid.arrange(plotobj1, plotobj2, plotobj3, plotobj4)user20650
Check this out maybe using an extra package might be a painless solution. cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)SabDeM

1 Answers

1
votes

Although you could also use the above mentioned grid.arrange and the multiplot function from cookbook-r.com, your code can also work. However, you're making it difficult for yourself by specifying a 4 by 4 grid, while all you need is a 2 by 2. And by the way: you don't need to make a NULL object first, so i have removed those lines.

library(ggplot2)
library(grid)
x1 <- c(seq(1,20,1))
y1 <- c(seq(50,69,1))
df <- data.frame(x1,y1)
df$DOSE[df$x1<= 10] <- "50 mg"
df$DOSE[df$x1 > 10] <- "100 mg"

filename <- "test_plot.png"
png(filename, width=700, height=900, pointsize=14)

#4 ggplot2 graphs in a grid layout
vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)
grid.newpage()
pushViewport(viewport(layout = grid.layout(2,2)))

#Plot 1
plotobj1 <-  ggplot(data=df)
plotobj1 <- plotobj1 + geom_point(aes(x=x1, y=y1,colour=DOSE), shape=1, size=3)
plotobj1  <-  plotobj1 + theme(legend.position="none")
print(plotobj1, vp=vplayout(1,1))
#Plot 2
plotobj2 <-  ggplot(df)
plotobj2 <- plotobj2 + geom_point(aes(x=x1, y=y1,colour=DOSE), shape=1, size=3)
plotobj2  <-  plotobj2 + theme(legend.position="none")
print(plotobj2, vp=vplayout(1,2))
#Plot 3 
plotobj3 <-  ggplot(df)
plotobj3 <- plotobj3 + geom_point(aes(x=x1, y=y1, colour=DOSE), shape=1, size=3)
plotobj3  <-  plotobj3 + scale_colour_brewer(name="Dose", palette="Set1")
print(plotobj3, vp=vplayout(2,1)) 
#Plot 4   CWRES vs PRED
plotobj4 <-  ggplot(df)
plotobj4 <- plotobj4 + geom_point(aes(x=x1, y=y1, colour=DOSE), shape=1, size=3)
plotobj4  <-  plotobj4 + scale_colour_brewer(name="Dose", palette="Set1")
print(plotobj4, vp=vplayout(2,2))

dev.off()

A 2x2 layout