2013-01-02 16 views
59

Temel ve ggplot grafikleri içeren bir şekil oluşturmak istiyorum. enter image description hereTaban ve ggplot grafiklerini R şekil penceresinde birleştirin

bu panellerin çoğu zaman rapora dahil etmek benim için yeterli bakmak üretir

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)") 

: Aşağıdaki kod R fonksiyonunun taslağını tabanını kullanarak şekil gösterir. Bununla birlikte, otokorelasyonu gösteren arsa geliştirilmelidir. Bu ggplot kullanarak çok daha iyi görünüyor:

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

Ancak ggplot gibi görerek, biz düzen veya eşit (mfrow) ile ggplot birleşemeyeceği bir baz grafik değil. Temel grafiklerden elde edilen otokorelasyon grafiğini ggplot tarafından oluşturulan ile nasıl değiştirebilirim? Bütün rakamlarım ggplot ile yapılmışsa, grid.arrange'ı kullanabilirim ama ggplot'ta sadece bir grafik oluşturulmuşsa bunu nasıl yapabilirim?

+3

neredeyse kadar kolay olmalı ve 'ggplot' benzeyen bir baz grafik grafiği oluşturmak amacıyla ACF' çıkışında() 'ile' polygon' kullanmak, daha tutarlı görünebilir bir. –

+0

Yanıtımız için teşekkürler. Bu soru gerçekten ggplot ve temel grafikleri bir şekil penceresinde nasıl birleştireceğimizi öğrenmeyi amaçlamakta, gösterilen rakamı üretmenin daha etkili yollarının olabileceğini fark ediyorum, ancak ileriki amaçlar için belirtilen yöntemi öğrenmek istiyorum. – KatyB

+3

'gridBase' paketine göz atın ... –

cevap

47

gridBase paketini kullanarak, yalnızca 2 satır ekleyerek bunu yapabilirsiniz. Ben sadece anlamak ve görünümleri ana ihtiyacınız ızgara ile komik arsa yapmak istiyorsanız düşünüyorum. Bu, ızgara paketinin temel nesnesidir.

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

baseViewports() işlevi ç ızgara görünüm listesinin bir listesini döndürür. Burada, şekil akım akımının şekil bölgesine karşılık gelen bir görünüm portunu kullanıyorum. nihai çözüm arar İşte nasıl

:

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 
+0

Evet Bunu denedim, sorun şu ki ggplot ile oluşturulan çizim çok daha büyük diğer panellerden (yukarıda görebileceğiniz gibi). Bunu değiştirmek için bir yöntem var mı? – KatyB

+0

@Kate Cevabımı artırdım. – agstudy

+0

+1 Çok hoş. Çağrıyı "acf (...)" ile arsa "araması için değiştirdiyseniz.new() ', acf çizimini 'white-out' olarak 'grid.rect()' olarak çağırmaktan kaçınmanız gerekir. –

10

Bir Grob ve viewport ile baskı komutunu kullanabilirsiniz.
İlk arsa Baz grafik ardından 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) 
+0

Merhaba Ricardo. Parsellerin genişliklerini yönteminizle nasıl kontrol edeceğinizi biliyor musunuz? Örneğin, bir taban grafiği ve bir ggplot2 grafik yan yana, ancak temel grafik için daha geniş bir genişlikte istiyorum. –

+0

Merhaba Stéphane, bunu "viewport()" satırındaki ayarları yapın. Spesifik olarak, istediğiniz sonuçları elde edene kadar farklı değerleri denemek için 'width' ve 'y' değerlerini ayarlamak istersiniz. –

+0

Teşekkür ederim Ricardo. Aslında burada bir sorum var http://stackoverflow.com/questions/14358526/controlling-column-widths-for-side-by-side-base-graphic-and-ggplot2-graphic/14358752 –

5

Ben gridGraphics paketinin hayranıyım ekleyin. Bazı nedenlerden dolayı gridBase ile sorun yaşadım.

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