2013-01-02 6 views
59

ベースのグラフィックとggplotのグラフィックを組み合わせた図を生成したいと思います。次のコードでは、Rの機能をプロットベースを使用して、私の姿を示していますRのFigureウィンドウでbaseとggplotのグラフィックを結合する

enter image description here

私のレポートに含めるためにこれらのパネルのほとんどは十分に見えるが生成

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

。しかし、自己相関を示すプロットを改善する必要があります。 ggplotはベースのグラフィックではないとして、我々はレイアウトやパー(mfrow)と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

:これはggplotを使用して、非常に良く見えます。どのようにして、ベースグラフィックスから生成された自己相関プロットをggplotによって生成されたプロットと置き換えることができますか? ggplotですべての人物が作成されていればgrid.arrangeを使うことができますが、ggplotで生成されたプロットが1つだけの場合はどうすればいいですか?

+3

それはほとんどのように容易で、かつ 'ggplot'に似ているベースのグラフィックスプロットを構築するためにACF'の出力() 'と' polygon'を使用するように、より一貫性になります。 1。 –

+0

私たちの応答ありがとう。この質問は、図形ウィンドウでggplotとベースグラフィックを組み合わせる方法を実際に学習することを目的としていますが、図を生成するより効率的な方法があるかもしれませんが、将来のために指定された方法を学びたいと思います。 – KatyB

+3

'gridBase'パッケージをチェックアウトしてください... –

答えて

47

gridBaseパッケージを使用すると、2行追加するだけで済みます。あなたが理解して習得するために必要なグリッドで面白いプロットをしたいのであれば、ビューポートと思っています。それは本当にグリッドパッケージの基本的なオブジェクトです。

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

baseViewports()関数は、3つのグリッドビューポートのリストを返します。私はここにフィギュアを使用します。Viewport の図領域に対応するビューポート現在のプロットです。あなたはグロブとビューポートで印刷コマンドを使用することができます

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

はい、これを試してみましたが、この問題はggplotで生成されたプロットがはるかに大きいことです他のパネルよりも優れています(上記のように)。これを変更する方法はありますか? – KatyB

+0

@Kate私は私の答えをupadte。 – agstudy

+0

+1とてもいいです。 'acf(...)'への呼び出しを 'plot 'の呼び出しで置き換えた場合。new() 'を呼び出すと、grid.rect()を呼び出してacfプロットを白抜きにする必要がなくなります。 –

10

:それは最終的な解決策をどのように見えるかをここで


最初のプロットお使いのベースのグラフィックスは、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

こんにちはリカルド。あなたの方法でプロットの幅を制御する方法を知っていますか?たとえば、ベースグラフィックとggplot2グラフィックを並べて、ベースグラフィックの幅を広げたいとします。 –

+0

こんにちはStéphane、これは 'viewport()'行の設定を調整するのに役立ちます。具体的には、 'width'と' y'の値を調整して、望みの結果が得られるまで違う値を試してみたいと思うでしょう。 –

+0

ありがとう、リカルド。実際に私はここに質問を開いているhttp://stackoverflow.com/questions/14358526/controlling-column-widths-for-side-by-side-base-graphic-and-ggplot2-graphic/14358752 –

5

私はgridGraphicsパッケージのファンですが追加します。何らかの理由で私は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

関連する問題