78 votes

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

Je voudrais générer un chiffre qui a une combinaison de base et ggplot graphiques. Le code suivant montre ma figure à l'aide de la base de traçage des fonctions 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 panneaux look suffisant pour m'inclure dans mon rapport. Cependant, le montre le tracé de l'auto-corrélation doit être améliorée. C'est 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, voyant que ggplot n'est pas un graphique de base, on ne peut pas combiner les ggplot avec mise en page ou par(mfrow). Comment pourrais-je remplacer l'autocorrélation de la parcelle généré à partir de la base de graphiques avec celui généré par ggplot? Je sais que je peux utiliser la grille.organiser si tous mes chiffres ont été rendus avec ggplot mais comment dois-je faire si un seul de ces parcelles sont générés dans ggplot?

56voto

agstudy Points 55104

À l'aide de gridBase package, vous pouvez le faire en ajoutant seulement 2 lignes. Je pense que si vous voulez faire drôle la parcelle avec la grille, vous avez juste besoin de comprendre et maîtriser les fenêtres. C'est vraiment l'objet de base de la grille de package.

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

Le baseViewports() renvoie une liste de trois grilles de fenêtres. J'utilise ici la figure du Viewport Une vue correspondant à la figure de la région de l' actuelle parcelle.

Voici comment cela se présente de 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

16voto

Ricardo Saporta Points 22951

Vous pouvez utiliser la commande print avec un grob et une fenêtre.
Commencez par tracer 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)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X