Mike Shea
Mike Shea

Reputation: 867

grid.arrange from gridExtras exiting with "only 'grobs' allowed in 'gList'" after update

I just updated R, R Studio, and a bunch of packages including ggplot2 and gridExtras on my Mac. Now gridExtras is failing in basic plotting with the error:

"only 'grobs' allowed in "gList""

Here's some code that should work but does not:

library(ggplot2)
p1 = qplot(1:10,rnorm(10))
p2 = qplot(1:10,rnorm(10))
library(gridExtra)
grid.arrange(p1, p2, ncol=2, main = "Main title")

This dumps out the following error:

Error in gList(list(grobs = list(list(x = 0.5, y = 0.5, width = 1, height = 1,  : 
  only 'grobs' allowed in "gList"
In addition: Warning message:
In grob$wrapvp <- vp : Coercing LHS to a list

Any help is appreciated!

Upvotes: 51

Views: 87815

Answers (2)

derelict
derelict

Reputation: 3906

The error can also occur if the plots are generated using base plots, as grid.arrange is intended to be used with "grid graphical objects" (grobs), such as ggplot2.

One could find an equivalent grid-plot or use a base-graphics approach to stacking plots (below).

For plots like this, sometimes it is easier to first determine the dimensions that the plot should be, then export the plots as individual files, import them into power point (using a custom slide size that fits the figure dimensions), arrange the plots, then export a high resolution file.

A solution for base plots:

par(mfrow = c(2, 1))
plot(rnorm(100))
hist(rnorm(100)) 
par(mfrow = c(1, 1)) #reset this parameter

enter image description here

Upvotes: 8

Mike Wise
Mike Wise

Reputation: 22807

It is because grid.arrange does not have a main parameter anymore (seems to have been eliminated around Summer 2015 with the 2.0.0 release) and thus thinks that the main= parameter must be a grob. To replace the main, you can use the top parameter now (as well as a bottom, left, and right).

So this works for example:

library(ggplot2)
p1 = qplot(1:10,rnorm(10))
p2 = qplot(1:10,rnorm(10))

library(gridExtra)
grid.arrange(p1, p2, ncol=2,top="Main Title")

The message is a bit confusing, that is because it looks at all the parameters it does not know and assumes they might be grobs (graphical objects) that it can plot. A confusing error message like this is the price you pay for that flexibility.

Note: - if you have a lot of grobs you should consider packing them all into a list and use the form:

grid.arrange( grobs = list(p1,p2,...),...

Here is what that above code results in:

enter image description here

Upvotes: 64

Related Questions