How to arrange graphs in ggplot2 without the help of the layout matrix

How do you arrange non-simmetric plots in ggplot2?

With the print command:

After installing these two packages: install.packages(“grid”, “ggplot2”), load the libraries:

library(grid)

library(ggplot2)

The data and code for the three graphs is taken from this website:

# create factors with value labels

mtcars$gear <- factor(mtcars$gear,levels=c(3,4,5), labels=c("3gears","4gears","5gears"))

mtcars$am <- factor(mtcars$am,levels=c(0,1), labels=c("Automatic","Manual"))

mtcars$cyl <- factor(mtcars$cyl,levels=c(4,6,8), labels=c("4cyl","6cyl","8cyl"))

# Kernel density plots for mpg

# grouped by number of gears (indicated by color)

a <- qplot(mpg, data=mtcars, geom="density", fill=gear, alpha=I(.5),

main="Distribution of Gas Milage", xlab="Miles Per Gallon",

ylab="Density")

# Scatterplot of mpg vs. hp for each combination of gears and cylinders

# in each facet, transmittion type is represented by shape and color

b <- qplot(hp, mpg, data=mtcars, shape=am, color=am,

facets=gear~cyl, size=I(3),

xlab="Horsepower", ylab="Miles per Gallon")

c <- qplot(gear, mpg, data=mtcars, geom=c("boxplot", "jitter"),

fill=gear, main="Mileage by Gear Number",

xlab="", ylab="Miles per Gallon")

a, b, and c are our graphs. Here we decide how to place the plots on the plotting surface:

grid.newpage() # Open a new page on grid device

pushViewport(viewport(layout = grid.layout(3, 1))) #this can really be anything... just remember to change accordingly the print commands below

print(a, vp = viewport(layout.pos.row = 1, layout.pos.col = 1:1))

print(b, vp = viewport(layout.pos.row = 2, layout.pos.col = 1:1))

print(c, vp = viewport(layout.pos.row = 3, layout.pos.col = 1:1))

The layout=grid.layout is the command dividing the plotting surface, in the example I have divided it into three rows and one column, hence the layout.pos.row = 1, 2, 3 and the layout.pos.row = 1:1 equal for all three plots.

What if I need something asymmetrical? For instance two small plots on one column and one taking up more space… The reasoning is very similar to that of the layout matrix: divide the space into 4 squares grid.layout(2, 2) and then plot the third graph over two rows layout.pos.row=1:2



grid.newpage() # Open a new page on grid device

pushViewport(viewport(layout = grid.layout(2, 2))) #this can really be anything... just remember to change accordingly the print commands below

print(a, vp = viewport(layout.pos.row = 1, layout.pos.col = 1:1))

print(b, vp = viewport(layout.pos.row = 2, layout.pos.col = 1:1))

print(c, vp = viewport(layout.pos.row = 1:2, layout.pos.col = 2:2))

