Combina la grafica di base e ggplot nella finestra della figura R

Mi piacerebbe generare una figura che abbia una combinazione di grafica di base e ggplot. Il seguente codice mostra la mia figura usando le funzioni di tracciamento di base di 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)") 

Che genera inserisci la descrizione dell'immagine qui

La maggior parte di questi pannelli mi sembra sufficiente da includere nel mio rapporto. Tuttavia, la trama che mostra l’autocorrelazione deve essere migliorata. Questo sembra molto meglio usando 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() 

inserisci la descrizione dell'immagine qui

Tuttavia, visto che ggplot non è un grafico di base, non possiamo combinare ggplot con il layout o il par (mfrow). Come posso sostituire il grafico di autocorrelazione generato dalla grafica di base con quello generato da ggplot? So che posso usare grid.arrange se tutte le mie figure sono state create con ggplot, ma come faccio se solo uno dei grafici viene generato in ggplot?

Usando il pacchetto gridBase, puoi farlo semplicemente aggiungendo 2 linee. Penso che se vuoi fare una trama divertente con la griglia devi solo capire e dominare i viewport . È davvero l’object base del pacchetto della griglia.

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

La funzione baseViewports () restituisce un elenco di tre windows di griglia. Io uso qui figura Viewport Un viewport corrispondente alla regione della figura del grafico corrente .

Ecco come appare la soluzione finale:

inserisci la descrizione dell'immagine qui

 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 

È ansible utilizzare il comando di stampa con un grob e una vista.
Per prima cosa traccia la grafica di base e aggiungi il 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) 

Sono un fan del pacchetto gridGraphics. Per qualche motivo ho avuto problemi con 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) 

inserisci la descrizione dell'immagine qui