Combine base and ggplot graphics in R figure window
Using gridBase package, you can do it just by adding 2 lines. I think if you want to do funny plot with the grid you need just to understand and master viewports. It is really the basic object of the grid package.
vps <- baseViewports()pushViewport(vps$figure) ## I am in the space of the autocorrelation plot
The baseViewports() function returns a list of three grid viewports. I use here figure ViewportA viewport corresponding to the figure region of the current plot.
Here how it looks the final solution:
library(gridBase)library(grid)par(mfrow=c(2, 2))plot(y,type = "l",xlab = "Time (hours)",ylab = "Amplitude",main = "Time series")plot(wt.t1, plot.cb=FALSE, plot.phase=FALSE,main = "Continuous wavelet transform", ylab = "Period (hours)",xlab = "Time (hours)")spectrum(y,method = "ar",main = "Spectral density function", xlab = "Frequency (cycles per hour)",ylab = "Spectrum")## the last one is the current plotplot.new() ## suggested by @Joshvps <- baseViewports()pushViewport(vps$figure) ## I am in the space of the autocorrelation plotvp1 <-plotViewport(c(1.8,1,0,1)) ## create new vp with margins, you play with this values require(ggplot2)acz <- acf(y, plot=F)acd <- data.frame(lag=acz$lag, acf=acz$acf)p <- ggplot(acd, aes(lag, acf)) + geom_area(fill="grey") + geom_hline(yintercept=c(0.05, -0.05), linetype="dashed") + theme_bw()+labs(title= "Autocorrelation\n")+ ## some setting in the title to get something near to the other plots theme(plot.title = element_text(size = rel(1.4),face ='bold'))print(p,vp = vp1) ## suggested by @bpatiste
You can use the print command with a grob and viewport.
First plot your base graphics then add the ggplot
library(grid)# Let's say that P is your plotP <- ggplot(acd, # etc... )# create an apporpriate viewport. Modify the dimensions and coordinates as neededvp.BottomRight <- viewport(height=unit(.5, "npc"), width=unit(0.5, "npc"), just=c("left","top"), y=0.5, x=0.5)# plot your base graphics par(mfrow=c(2,2))plot(y,type #etc .... )# plot the ggplot using the print commandprint(P, vp=vp.BottomRight)
I'm a fan of the gridGraphics package. For some reason I had trouble with gridBase.
library(ggplot2)library(gridGraphics)data.frame(x = 2:10, y = 12:20) -> datplot(dat$x, dat$y)grid.echo()grid.grab() -> mapgrobggplot(data = dat) + geom_point(aes(x = x, y = y)) pushViewport(viewport(x = .8, y = .4, height = .2, width = .2)) grid.draw(mapgrob)