Combine os charts base e ggplot na janela da figura R

Eu gostaria de gerar uma figura que tenha uma combinação de charts base e ggplot. O código a seguir mostra minha figura usando as funções de plotagem de base de R:

t <- c(1:(24*14)) P <- 24 A <- 10 y <- A*sin(2*pi*t/P)+20 par(mfrow=c(2,2)) plot(y,type = "l",xlab = "Time (hours)",ylab = "Amplitude",main = "Time series") acf(y,main = "Autocorrelation",xlab = "Lag (hours)", ylab = "ACF") spectrum(y,method = "ar",main = "Spectral density function", xlab = "Frequency (cycles per hour)",ylab = "Spectrum") require(biwavelet) t1 <- cbind(t, y) wt.t1=wt(t1) plot(wt.t1, plot.cb=FALSE, plot.phase=FALSE,main = "Continuous wavelet transform", ylab = "Period (hours)",xlab = "Time (hours)") 

Que gera insira a descrição da imagem aqui

A maioria desses painéis parece suficiente para include no meu relatório. No entanto, o gráfico mostrando a autocorrelação precisa ser melhorado. Isso parece muito melhor usando o ggplot:

 require(ggplot2) acz <- acf(y, plot=F) acd <- data.frame(lag=acz$lag, acf=acz$acf) ggplot(acd, aes(lag, acf)) + geom_area(fill="grey") + geom_hline(yintercept=c(0.05, -0.05), linetype="dashed") + theme_bw() 

insira a descrição da imagem aqui

No entanto, visto que ggplot não é um gráfico base, não podemos combinar ggplot com layout ou par (mfrow). Como eu poderia replace o gráfico de autocorrelação gerado a partir do gráfico base com o gerado pelo ggplot? Eu sei que posso usar grid.arrange se todas as minhas figuras foram feitas com ggplot mas como faço isso se apenas um dos charts for gerado em ggplot?

    Usando o pacote gridBase, você pode fazer isso apenas adicionando 2 linhas. Eu acho que se você quiser fazer um enredo engraçado com a grade, você precisa apenas entender e dominar as visões . É realmente o object básico do pacote da grade.

     vps <- baseViewports() pushViewport(vps$figure) ## I am in the space of the autocorrelation plot 

    A function baseViewports () retorna uma lista de três viewports de grade. Eu uso aqui a figura Porta de visualização Uma porta de visualização correspondente à região da figura da plotagem atual .

    Aqui está como parece a solução final:

    insira a descrição da imagem aqui

     library(gridBase) 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 plot plot.new() ## suggested by @Josh vps <- baseViewports() pushViewport(vps$figure) ## I am in the space of the autocorrelation plot vp1 <-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 

    Você pode usar o comando de impressão com um grob e viewport.
    Primeiro traçar seus charts base, em seguida, adicione o ggplot

     library(grid) # Let's say that P is your plot P <- ggplot(acd, # etc... ) # create an apporpriate viewport. Modify the dimensions and coordinates as needed vp.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 command print(P, vp=vp.BottomRight) 

    Sou fã do pacote gridGraphics. Por alguma razão eu tive problemas com o gridBase.

     library(ggplot2) library(gridGraphics) data.frame(x = 2:10, y = 12:20) -> dat plot(dat$x, dat$y) grid.echo() grid.grab() -> mapgrob ggplot(data = dat) + geom_point(aes(x = x, y = y)) pushViewport(viewport(x = .8, y = .4, height = .2, width = .2)) grid.draw(mapgrob) 

    insira a descrição da imagem aqui