1. ホーム
  2. r

R の図形ウィンドウで base と ggplot のグラフィックを結合する

2023-09-17 11:09:29

質問

baseとggplotを組み合わせた図を作成したいのですが、どうすればよいでしょうか。次のコードは、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)")

これは

これらのパネルのほとんどは、私のレポートに含めるには十分なように見えます。しかし、自己相関を示すプロットは改善される必要があります。これは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()

<イグ

しかし、ggplotはベースグラフィックではないので、ggplotとlayoutやpar(mfrow)を組み合わせることができません。ベースグラフィックから生成された自己相関プロットをggplotから生成されたものに置き換えるにはどうしたらよいでしょうか?すべての図形がggplotで作成されていればgrid.arrangeが使えることは知っていますが、1つのプロットだけがggplotで生成されている場合はどうすればいいでしょうか?

どのように解決するのですか?

gridBase パッケージを使えば、2行追加するだけでできます。グリッドを使って面白いプロットをしたいのであれば、以下のことを理解し、マスターする必要があると思います。 ビューポート . これは本当にグリッドパッケージの基本的なオブジェクトです。

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

baseViewports()関数は、3つのグリッドビューポートのリストを返します。 ここでは図ビューポートを使用します の図領域に対応するビューポートです。 現在 プロットの図領域に対応するビューポートです。

最終的な解答は以下のようになります。

library(gridBase)
library(grid)

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