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
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()
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?
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:
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
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)
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)
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)