web-dev-qa-db-fra.com

Combinez les graphiques de base et ggplot dans la fenêtre de figure R

Je voudrais générer une figure qui a une combinaison de graphiques de base et de ggplot. Le code suivant montre ma figure en utilisant les fonctions de traçage 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)")

Qui génère enter image description here

La plupart de ces panels me semblent suffisants à inclure dans mon rapport. Cependant, le graphique montrant l'autocorrélation doit être amélioré. Cela semble beaucoup mieux en utilisant 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()

enter image description here

Cependant, comme ggplot n'est pas un graphique de base, nous ne pouvons pas combiner ggplot avec layout ou par (mfrow). Comment pourrais-je remplacer le tracé d'autocorrélation généré à partir des graphiques de base par celui généré par ggplot? Je sais que je peux utiliser grid.arrange si toutes mes figures ont été faites avec ggplot, mais comment faire si un seul des tracés est généré dans ggplot?

68
KatyB

En utilisant le package gridBase, vous pouvez le faire simplement en ajoutant 2 lignes. Je pense que si vous voulez faire une intrigue amusante avec la grille, il vous suffit de comprendre et de maîtriser fenêtres. C'est vraiment l'objet de base du package de grille.

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

La fonction baseViewports () renvoie une liste de trois fenêtres de grille. J'utilise ici figure Viewport Une fenêtre correspondant à la région de la figure du tracé actuel.

Voici à quoi cela ressemble la solution finale:

enter image description here

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
51
agstudy

Vous pouvez utiliser la commande d'impression avec un grob et une fenêtre.
Tracez d'abord vos graphiques de base puis ajoutez le 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)
15
Ricardo Saporta

Je suis fan du package gridGraphics. Pour une raison quelconque, j'ai eu des problèmes avec 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)

enter image description here

7
Chris

cowplot le package a la fonction recordPlot() pour capturer les tracés R de base afin qu'ils puissent être rassemblés dans la fonction plot_grid().

library(biwavelet)
library(ggplot2)
library(cowplot)

t <- c(1:(24*14)) 
P <- 24 
A <- 10 
y <- A*sin(2*pi*t/P)+20

plot(y,type = "l",xlab = "Time (hours)",ylab = "Amplitude",main = "Time series")
### record the previous plot
p1 <- recordPlot()  

spectrum(y,method = "ar",main = "Spectral density function", 
         xlab = "Frequency (cycles per hour)",ylab = "Spectrum")
p2 <- recordPlot()

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)")
p3 <- recordPlot()

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

### combine all plots together
plot_grid(p1, p4, p2, p3,
          labels = 'AUTO',
          hjust = 0, vjust = 1)

Créé le 2019-03-17 par le package reprex (v0.2.1.9000)

1
Tung